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
的包名称
我正在创建一个在底部导航菜单中包含 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
创建的 .SettingsActivitypublic 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