如何将工具栏添加到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); } } 

这不是一个非常优雅的解决scheme,但它的工作。 testing姜饼和棒棒糖。

尝试这个:

 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的Activity上解决了这个推杆主题

 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假设是compat的一个推理类。

当你喜欢PreferenceActivity像工具栏或其他一些compat问题,你应该考虑它。 就像@DavidVá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给&#x51FA;

在你的onCreate()方法中添加这一行。

  addPreferencesFromResource( R.xml.pref_setting ); 

并去configuration您的首选项XML(也在该页面上的使用)。 运行你的应用程序,你会发现它的工作原理。然后你可以做一些其他的东西装饰/添加菜单工具栏/添加监听器或只是添加一些与您的应用程序相关的逻辑代码。