实际上我find了另一个解决方案。 您仍然可以使用Preferenceability:
只需添加一个调用自定义布局的片段并添加它的类。 但是你会在Manifest中收到警告:(你可以忽略或修复)
[res](AndroidManifest.xml)
android:name=".SettingsActivity_CUSTOMLAYOUT1"
“YOURPACKAGE.SettingsActivity_CUSTOMLAYOUT1不公开”
它只能从您的SettingsActivity中调用,因此您可以忽略它
要么
如果你想从外面调用这个Activity,只需为它创建一个自己的类,并将其命名为SettingsActivity_CUSTOMLAYOUT1.java。
码:
[java](SettingsActivity.java)
public class SettingsActivity extends AppCompatPreferenceActivity { private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object value) { String stringValue = value.toString(); if (preference instanceof ListPreference) { ListPreference listPreference = (ListPreference) preference; int index = listPreference.findIndexOfValue(stringValue); preference.setSummary( index >= 0 ? listPreference.getEntries()[index] : null); } else if (preference instanceof RingtonePreference) { if (TextUtils.isEmpty(stringValue)) { preference.setSummary(R.string.pref_ringtone_silent); } else { Ringtone ringtone = RingtoneManager.getRingtone( preference.getContext(), Uri.parse(stringValue)); if (ringtone == null) { preference.setSummary(null); } else { String name = ringtone.getTitle(preference.getContext()); preference.setSummary(name); } } } else { preference.setSummary(stringValue); } return true; } }; private static boolean isXLargeTablet(Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; } private static void bindPreferenceSummaryToValue(Preference preference) { preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager .getDefaultSharedPreferences(preference.getContext()) .getString(preference.getKey(), "")); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupActionBar(); } private void setupActionBar() { ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } } @Override public boolean onIsMultiPane() { return isXLargeTablet(this); } @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) public void onBuildHeaders(Listtarget) { loadHeadersFromResource(R.xml.pref_headers, target); } protected boolean isValidFragment(String fragmentName) { return PreferenceFragment.class.getName().equals(fragmentName) || YOURFRAGMENT1.class.getName().equals(fragmentName) || YOURFRAGMENT2.class.getName().equals(fragmentName) || CUSTOMLAYOUT1.class.getName().equals(fragmentName) //... Add Fragments } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class YOURFRAGMENT1 extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.YOURFRAGMENTXML1); setHasOptionsMenu(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class YOURFRAGMENT2 extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.pref_private_data); setHasOptionsMenu(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class FRAGMENTFORCUSTOMLAYOUT1 extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); startActivity(new Intent(getActivity(), SettingsActivity.class)); startActivity(new Intent(getActivity(), CUSTOMLAYOUT1.class)); setHasOptionsMenu(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { startActivity(new Intent(getActivity(), SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } } } class SettingsActivity_CUSTOMLAYOUT1 extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.CUSTOMLAYOUT1); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; default: return super.onOptionsItemSelected(item); } } }
[xml](pref_headers.xml)
[布局](CUSTOMLAYOUT1.xml)
别忘了添加Manifest。
[res](AndroidManifest.xml)