Как добавить панели инструментов в AppCompatPreferenceActivity?

Я пытаюсь добавить панели инструментов в AppCompatPreferenceActivity, но я не знаю, как это сделать.

Можете ли вы сказать мне, как это сделать?

Solutions Collecting From Web of "Как добавить панели инструментов в AppCompatPreferenceActivity?"

Сначала скопируйте AppCompatPreferenceActivity в свой проект.

Используйте его так:

public class SettingsActivity extends AppCompatPreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupActionBar(); } private void setupActionBar() { Toolbar toolbar; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { ViewGroup root = (ViewGroup) findViewById(android.R.id.list).getParent().getParent().getParent(); toolbar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.view_toolbar, root, false); root.addView(toolbar, 0); } else { ViewGroup root = (ViewGroup) findViewById(android.R.id.content); ListView content = (ListView) root.getChildAt(0); root.removeAllViews(); toolbar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.view_toolbar, root, false); int height; TypedValue tv = new TypedValue(); if (getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) { height = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics()); } else { height = toolbar.getHeight(); } content.setPadding(0, height, 0, 0); root.addView(content); root.addView(toolbar); } setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } } 

Это не очень элегантное решение, но оно работает. Протестировано на прянике и леденец.

Попробуй это:

 public class SettingsActivity extends AppCompatPreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout root = (LinearLayout) findViewById(android.R.id.list).getParent().getParent().getParent(); Toolbar toolbar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.toolbar_settings, root, false); root.addView(toolbar, 0); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } } 

РЕДАКТИРОВАТЬ

AppCompatPreferenceActivity – это демонстрационный класс для supprt v7:

https://android.googlesource.com/platform/development/+/nougat-release/samples/Support7Demos/src/com/example/android/supportv7/app/AppCompatPreferenceActivity.java

Я решил эту тему для «Активность на AndrodManifest»

 android:theme="@style/Theme.AppCompat.Light" 

Используйте PreferenceFragment, вы можете сделать это в своей деятельности:

 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new MyPreferenceFragment()).commit(); 

И MyPreferenceFragment вот так:

 public class MyPreferenceFragment extends PreferenceFragment{ @Override public void onCreate(final Bundle savedInstanceState){ super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } } 

Надеюсь, это помогло!

Вы можете использовать Android Studio для генерации активности настроек, и она может автоматически генерировать пример кода следующим образом:

 import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.preference.RingtonePreference; import android.support.v7.app.ActionBar; import android.text.TextUtils; import android.view.MenuItem; import java.util.List; /** * A {@link PreferenceActivity} that presents a set of application settings. On * handset devices, settings are presented as a single list. On tablets, * settings are split by category, with category headers shown to the left of * the list of settings. * <p> * See <a href="http://developer.android.com/design/patterns/settings.html"> * Android Design: Settings</a> for design guidelines and the <a * href="http://developer.android.com/guide/topics/ui/settings.html">Settings * API Guide</a> for more information on developing a Settings UI. */ public class SettingsActivity extends AppCompatPreferenceActivity { /** * A preference value change listener that updates the preference's summary * to reflect its new value. */ private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange ( Preference preference, Object value ) { String stringValue = value.toString(); if ( preference instanceof ListPreference ) { // For list preferences, look up the correct display value in // the preference's 'entries' list. ListPreference listPreference = ( ListPreference ) preference; int index = listPreference.findIndexOfValue( stringValue ); // Set the summary to reflect the new value. preference.setSummary( index >= 0 ? listPreference.getEntries()[ index ] : null ); } else if ( preference instanceof RingtonePreference ) { // For ringtone preferences, look up the correct display value // using RingtoneManager. if ( TextUtils.isEmpty( stringValue ) ) { // Empty values correspond to 'silent' (no ringtone). preference.setSummary( R.string.pref_ringtone_silent ); } else { Ringtone ringtone = RingtoneManager.getRingtone( preference.getContext(), Uri.parse( stringValue ) ); if ( ringtone == null ) { // Clear the summary if there was a lookup error. preference.setSummary( null ); } else { // Set the summary to reflect the new ringtone display // name. String name = ringtone.getTitle( preference.getContext() ); preference.setSummary( name ); } } } else { // For all other preferences, set the summary to the value's // simple string representation. preference.setSummary( stringValue ); } return true; } }; /** * Helper method to determine if the device has an extra-large screen. For * example, 10" tablets are extra-large. */ private static boolean isXLargeTablet ( Context context ) { return ( context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK ) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; } /** * Binds a preference's summary to its value. More specifically, when the * preference's value is changed, its summary (line of text below the * preference title) is updated to reflect the value. The summary is also * immediately updated upon calling this method. The exact display format is * dependent on the type of preference. * * @see #sBindPreferenceSummaryToValueListener */ private static void bindPreferenceSummaryToValue ( Preference preference ) { // Set the listener to watch for value changes. preference.setOnPreferenceChangeListener( sBindPreferenceSummaryToValueListener ); // Trigger the listener immediately with the preference's // current value. sBindPreferenceSummaryToValueListener.onPreferenceChange( preference, PreferenceManager.getDefaultSharedPreferences( preference.getContext() ) .getString( preference.getKey(), "" ) ); } @Override protected void onCreate ( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); setupActionBar(); } /** * Set up the {@link android.app.ActionBar}, if the API is available. */ private void setupActionBar () { ActionBar actionBar = getSupportActionBar(); if ( actionBar != null ) { // Show the Up button in the action bar. actionBar.setDisplayHomeAsUpEnabled( true ); actionBar.setHomeButtonEnabled( true ); } } @Override public boolean onOptionsItemSelected ( MenuItem item ) { switch ( item.getItemId() ) { case android.R.id.home: finish(); } return super.onOptionsItemSelected( item ); } /** {@inheritDoc} */ @Override public boolean onIsMultiPane () { return isXLargeTablet( this ); } /** {@inheritDoc} */ @Override @TargetApi ( Build.VERSION_CODES.HONEYCOMB ) public void onBuildHeaders ( List< Header > target ) { loadHeadersFromResource( R.xml.pref_headers, target ); } /** * This method stops fragment injection in malicious applications. * Make sure to deny any unknown fragments here. */ protected boolean isValidFragment ( String fragmentName ) { return PreferenceFragment.class.getName().equals( fragmentName ) || GeneralPreferenceFragment.class.getName().equals( fragmentName ) || DataSyncPreferenceFragment.class.getName().equals( fragmentName ) || NotificationPreferenceFragment.class.getName().equals( fragmentName ); } /** * This fragment shows general preferences only. It is used when the * activity is showing a two-pane settings UI. */ @TargetApi ( Build.VERSION_CODES.HONEYCOMB ) public static class GeneralPreferenceFragment extends PreferenceFragment { @Override public void onCreate ( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); addPreferencesFromResource( R.xml.pref_general ); setHasOptionsMenu( true ); // Bind the summaries of EditText/List/Dialog/Ringtone preferences // to their values. When their values change, their summaries are // updated to reflect the new value, per the Android Design // guidelines. bindPreferenceSummaryToValue( findPreference( "example_text" ) ); bindPreferenceSummaryToValue( findPreference( "example_list" ) ); } @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 ); } } /** * This fragment shows notification preferences only. It is used when the * activity is showing a two-pane settings UI. */ @TargetApi ( Build.VERSION_CODES.HONEYCOMB ) public static class NotificationPreferenceFragment extends PreferenceFragment { @Override public void onCreate ( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); addPreferencesFromResource( R.xml.pref_notification ); setHasOptionsMenu( true ); // Bind the summaries of EditText/List/Dialog/Ringtone preferences // to their values. When their values change, their summaries are // updated to reflect the new value, per the Android Design // guidelines. bindPreferenceSummaryToValue( findPreference( "notifications_new_message_ringtone" ) ); } @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 ); } } /** * This fragment shows data and sync preferences only. It is used when the * activity is showing a two-pane settings UI. */ @TargetApi ( Build.VERSION_CODES.HONEYCOMB ) public static class DataSyncPreferenceFragment extends PreferenceFragment { @Override public void onCreate ( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); addPreferencesFromResource( R.xml.pref_data_sync ); setHasOptionsMenu( true ); // Bind the summaries of EditText/List/Dialog/Ringtone preferences // to their values. When their values change, their summaries are // updated to reflect the new value, per the Android Design // guidelines. bindPreferenceSummaryToValue( findPreference( "sync_frequency" ) ); } @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 ); } } } 

AppCompatPreferenceActivity.class, как мы все знаем:

/** * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls * to be used with AppCompat. */

Очевидно, AppCompatPreferenceActivity.class предполагает, что это класс sulotion для compat.

Когда вы сталкиваетесь с некоторыми проблемами совместимости с PreferenceActivity, такими как панель инструментов или что-то еще, вы должны это учитывать. Подобно тому, как автор дал @David Vávra, что идеально, его код может сделать трюк.

И вы продолжаете спрашивать, как настроить эту активность предпочтений (которую я искал … иначе я не стану на Stackoverflow)

Поэтому я читаю эту страницу https://developer.android.com/reference/android/preference/PreferenceActivity.html и плюс с двумя страницами, данными javadoc. Я думаю, что путь к клиенту дочерний класс AppCompatPreferenceActivity выглядит следующим образом:


Если вы просто хотите, чтобы ваша ** SettingActivity выглядела как внешний вид PreferenceFragment, вы не должны переопределять этот метод «onBuildHeaders ()»

  /** {@inheritDoc} */ @Override @TargetApi ( Build.VERSION_CODES.HONEYCOMB ) public void onBuildHeaders ( List< Header > target ) { loadHeadersFromResource( R.xml.pref_headers, target ); } 

FYI использование pref_headers задается на странице https://developer.android.com/reference/android/preference/PreferenceActivity.html

И добавьте эту строку в свой метод onCreate ().

  addPreferencesFromResource( R.xml.pref_setting ); 

И перейдите к настройке вашего предпочтения XML (использование также на этой странице). Запустите приложение, вы найдете его работающим. Затем вы можете сделать что-то еще, например, украсить / добавить меню на панели инструментов / добавить слушателей или просто добавить логический код, связанный с вашим приложением.