单击首选项屏幕不会附加首选项片段
Clicking on preference screen does not attach preference fragment
我有一个带有 ListPreference 和 PreferenceScreen 的设置 activity。这两个
使用 PreferenceFragment 加载首选项。当 PreferenceScreen
单击后,第二个 PreferenceFragment 包含其他首选项列表,
替换第一个 PreferenceFragment。第二个片段已正确加载
但没有附加到 activity。当我按下后退按钮时,第二个片段
正确显示在 activity 的框架中,这是所需的操作
但在按下后退按钮后实现,而不是在按下
首选项屏幕。
这是 SettingsActivity 代码:
public class SettingsActivity extends Activity {
private static String TAG = "SettingsActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setDisplayShowTitleEnabled(false);
getActionBar().setDisplayShowHomeEnabled(false);
setContentView(R.layout.settings);
Log.i(TAG, "SettingsActivity called");
if(findViewById(R.id.fragment_container) != null) {
if(savedInstanceState != null) {
return;
}
getFragmentManager().beginTransaction().add(R.id.fragment_container,
new SettingsFragment()).commit();
}
}
public static class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings_preference);
PreferenceScreen ps = (PreferenceScreen) getPreferenceManager().findPreference("nots");
ps.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
SettingsFragment1 sf1 = new SettingsFragment1();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, sf1);
transaction.addToBackStack(null);
//transaction.attach(sf1); this proved to be redundant
transaction.commit();
return true;
}
});
}
}
public static class SettingsFragment1 extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings1_preference);
}
}
}
可能出了什么问题?提前致谢
嗯,问题是在 preference.xml
文件中,PreferenceScreen
标签与其他首选项一起完全部署,这些首选项应该与第二个首选项片段一起加载。因此,通过单击 PreferenceScreen
,后者加载了它的首选项,就好像它没有托管在片段中一样。我刚刚删除了 PreferenceScreen
下方的首选项并将其保留在自己的位置。
奇怪的是,一个问题的解决方案可能会在您提出后立即出现。
我有一个带有 ListPreference 和 PreferenceScreen 的设置 activity。这两个 使用 PreferenceFragment 加载首选项。当 PreferenceScreen 单击后,第二个 PreferenceFragment 包含其他首选项列表, 替换第一个 PreferenceFragment。第二个片段已正确加载 但没有附加到 activity。当我按下后退按钮时,第二个片段 正确显示在 activity 的框架中,这是所需的操作 但在按下后退按钮后实现,而不是在按下 首选项屏幕。
这是 SettingsActivity 代码:
public class SettingsActivity extends Activity {
private static String TAG = "SettingsActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setDisplayShowTitleEnabled(false);
getActionBar().setDisplayShowHomeEnabled(false);
setContentView(R.layout.settings);
Log.i(TAG, "SettingsActivity called");
if(findViewById(R.id.fragment_container) != null) {
if(savedInstanceState != null) {
return;
}
getFragmentManager().beginTransaction().add(R.id.fragment_container,
new SettingsFragment()).commit();
}
}
public static class SettingsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings_preference);
PreferenceScreen ps = (PreferenceScreen) getPreferenceManager().findPreference("nots");
ps.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
SettingsFragment1 sf1 = new SettingsFragment1();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, sf1);
transaction.addToBackStack(null);
//transaction.attach(sf1); this proved to be redundant
transaction.commit();
return true;
}
});
}
}
public static class SettingsFragment1 extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings1_preference);
}
}
}
可能出了什么问题?提前致谢
嗯,问题是在 preference.xml
文件中,PreferenceScreen
标签与其他首选项一起完全部署,这些首选项应该与第二个首选项片段一起加载。因此,通过单击 PreferenceScreen
,后者加载了它的首选项,就好像它没有托管在片段中一样。我刚刚删除了 PreferenceScreen
下方的首选项并将其保留在自己的位置。
奇怪的是,一个问题的解决方案可能会在您提出后立即出现。