Android - 片段内的 activity 设置为空

Android - Setting activity inside a fragment is empty

我正在创建一个在底部导航菜单中包含 5 个选项卡的应用程序。其中一个选项卡包含我使用 Android Studio 创建的默认设置 activity。每个选项卡上的 onClick 事件显示不同的片段。当我单击“设置”按钮时,设置 activity 的片段加载时没有错误,但它是空的。我已经看过其他地方,但仍然没有找到答案。我的问题不是在不同的片段中显示一组设置,而是第一次生成设置片段本身。

我在主 activity 中监听点击事件。然后我加载正确的片段 class,这个 class 调用 .SettingsActivity class 使用 [=57 生成视图=] 并从 root_parameters.xml 加载“设置”。我没有对 Android Studio 创建的默认值 activity 进行任何更改。我加载它的方式与加载其他片段的方式相同,它们都可以正常工作,包括 Google 地图片段。

这是我的 .MainActivity

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation);
    bottomNav.setOnNavigationItemSelectedListener(navListener);

    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment()).commit();
}

private BottomNavigationView.OnNavigationItemSelectedListener navListener =
        new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                Fragment selectedFragment = null;

                switch (item.getItemId()) {
                    case R.id.map_nav:
                        selectedFragment = new MapFragment();
                        break;
                    case R.id.settings_nav:
                        selectedFragment = new OldSettingsFragment();
                        break;
                    case R.id.user_nav:
                        selectedFragment = new UserFragment();
                        break;
                    case R.id.test_settings_nav:
                        selectedFragment = new SettingsFragment();
                        break;
                    default:
                        selectedFragment = new HomeFragment();
                        break;
                }

                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).commit();

                return true;
            }
        };

}

这是我的 .SettingsFragment

public class SettingsFragment extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    return inflater.inflate(R.layout.settings_activity, container, false);
}

}

这是由 Android Studio

创建的 .SettingsActivity
public class SettingsActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.settings_activity);
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.settings, new SettingsFragment())
            .commit();
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

public static class SettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey);
    }
}

}

这是settings_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".TestSettings.SettingsActivity">

    <FrameLayout
        android:id="@+id/settings"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

最后这是我的 root_preferences.xml

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">

<PreferenceCategory app:title="@string/app_name">

    <EditTextPreference
        app:key="signature"
        app:title="@string/signature_title"
        app:useSimpleSummaryProvider="true" />

    <ListPreference
        app:defaultValue="reply"
        app:entries="@array/reply_entries"
        app:entryValues="@array/reply_values"
        app:key="reply"
        app:title="@string/reply_title"
        app:useSimpleSummaryProvider="true" />

</PreferenceCategory>

<PreferenceCategory app:title="@string/sync_header">

    <SwitchPreferenceCompat
        app:key="sync"
        app:title="@string/sync_title" />

    <SwitchPreferenceCompat
        app:dependency="sync"
        app:key="attachment"
        app:summaryOff="@string/attachment_summary_off"
        app:summaryOn="@string/attachment_summary_on"
        app:title="@string/attachment_title" />

</PreferenceCategory>

请帮忙。

您正在 test_settings_nav 上加载 SettingsFragment 单击它会膨胀 R.layout.settings_activity 并且整个布局在 LinerLayout 下有一个 FrameLayout 而您没有没有在 FrameLayout 中加载任何内容,所以它是空的。在该框架布局上加载内容将出现在屏幕上。

您不能在 BottomNavigationView 个选项卡之一而不是片段中设置 Activity。

所以,你需要用一个 Fragment 替换 SettingsActivity,我将它命名为 PreferenceFragment 因为你已经有一个内部 SettingsFragment.

因此请将您的 SettingsActivity 修改为:

public class PreferenceFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_settings, container, false);
        
        ActionBar actionBar = requireActivity().getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

        return view;
    }

    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
        }
    }

}

所以,现在删除 settings_activity.xml 并且您需要创建 fragment_settings.xml 而不是为内部 SettingsActivity 片段

创建一个静态片段
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:id="@+id/settings_root"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/settingsFragment"
        class="com.xx.PreferenceFragment$SettingsFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

注意:将 com.xx 替换为包含 PreferenceFragment

的包名称