How to add ToolBar in PreferenceActivity?

匿名 (未验证) 提交于 2019-12-03 01:23:02

问题:

I want to add ToolBar in PreferenceActivity in my android application. I wrote the following code.

  public class SettingsActivity extends PreferenceActivity  {  SendSMS sms; protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     addPreferencesFromResource(R.xml.settings);     LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent();     android.support.v7.widget.Toolbar bar = (android.support.v7.widget.Toolbar) LayoutInflater.from(this).inflate(R.layout.action_bar_setting, root, false);     root.addView(bar, 0);     bar.setNavigationOnClickListener(new View.OnClickListener() {         @Override         public void onClick(View v) {             onBackPressed();         }     }); 

}

This worked perfectly in my android Kitkat phone API 19 but force closed in API level 10 i.e. gingerbread. Please suggest me.

回答1:

You need a layout that contains a Toolbar, and a ListView with android:id="@android:id/list"

activity_settings.xml

SettingsActivity.java

public class SettingsActivity extends PreferenceActivity {      private AppCompatDelegate mDelegate;      @Override     protected void onCreate(Bundle savedInstanceState) {         getDelegate().installViewFactory();         getDelegate().onCreate(savedInstanceState);         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_settings);         setSupportActionBar((Toolbar) findViewById(R.id.toolbar));         addPreferencesFromResource(R.xml.preferences);         ...     }      @Override     protected void onPostCreate(Bundle savedInstanceState) {         super.onPostCreate(savedInstanceState);         getDelegate().onPostCreate(savedInstanceState);     }      @Override     public void setContentView(@LayoutRes int layoutResID) {         getDelegate().setContentView(layoutResID);     }      @Override     protected void onPostResume() {         super.onPostResume();         getDelegate().onPostResume();     }      @Override     protected void onStop() {         super.onStop();         getDelegate().onStop();     }      @Override     protected void onDestroy() {         super.onDestroy();         getDelegate().onDestroy();     }      private void setSupportActionBar(@Nullable Toolbar toolbar) {         getDelegate().setSupportActionBar(toolbar);     }      private AppCompatDelegate getDelegate() {         if (mDelegate == null) {             mDelegate = AppCompatDelegate.create(this, null);         }         return mDelegate;     }     ... } 

Check out my fully working example:

Reference from the Android team: AppCompatPreferenceActivity



回答2:

Try:

public class SettingsActivity extends AppCompatPreferenceActivity { .....  @Override protected void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setupActionBar();     /* getFragmentManager().beginTransaction()             .replace(android.R.id.content, new GeneralPreferenceFragment())             .commit();     */      //addPreferencesFromResource(R.xml.pref_general);         }  private void setupActionBar() {     ViewGroup rootView = (ViewGroup)findViewById(R.id.action_bar_root); //id from appcompat      if (rootView != null) {         View view = getLayoutInflater().inflate(R.layout.app_bar_layout, rootView, false);         rootView.addView(view, 0);          Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);         setSupportActionBar(toolbar);     }      ActionBar actionBar = getSupportActionBar();     if (actionBar != null) {         // Show the Up button in the action bar.         actionBar.setDisplayHomeAsUpEnabled(true);     } } 

app_bar_layout.xml



回答3:

You can easily add toolbar from @android:style/Theme.Material.Light.DarkActionBar

In AndroidManifest.xml :

In v21/styles.xml

In v14/styles.xml for Back API support



回答4:

Very easy and working well in my case by inflating custom toolbar. In your java code do as below,

   public class SettingsPrefActivity extends AppCompatPreferenceActivity {         //  private static final String TAG = SettingsPrefActivity.class.getSimpleName();          @Override         protected void onCreate(Bundle savedInstanceState) {             super.onCreate(savedInstanceState);              //setting up toolbar             getLayoutInflater().inflate(R.layout.toolbar_setting, (ViewGroup) findViewById(android.R.id.content));             Toolbar toolbar = findViewById(R.id.toolbar);             toolbar.setTitle("Settings");             setSupportActionBars(toolbar);             getSupportActionBar().setDisplayHomeAsUpEnabled(true);              // load settings fragment             getFragmentManager().beginTransaction().replace(android.R.id.content, new MainPreferenceFragment()).commit();         }      } 

and at your xml side code,add one preference category at the top do as below,

   //put below line at the top of your xml preference layout screen..     

and in your layout resource folder toolbar_setting,

   


回答5:

xml

 

java code is,

     public class ActivitySettings extends PreferenceActivity {  private static final String TAG = "SB_ActivitySettings"; private AppCompatDelegate mDelegate;  @Override protected void onCreate(Bundle savedInstanceState) {     getDelegate().installViewFactory();     getDelegate().onCreate(savedInstanceState);     super.onCreate(savedInstanceState);     getFragmentManager().beginTransaction().replace(             android.R.id.content, new ActivitySettings.AboutPreferenceFragment()).commit(); }  private AppCompatDelegate getDelegate() {     if (mDelegate == null) {         mDelegate = AppCompatDelegate.create(this, null);     }     return mDelegate; }  protected boolean isValidFragment(String fragmentName) {     return PreferenceFragment.class.getName().equals(fragmentName)            || AboutPreferenceFragment.class.getName().equals(fragmentName); }  @Override protected void onStop() {     super.onStop();     getDelegate().onStop(); }  @Override protected void onDestroy() {     super.onDestroy();     getDelegate().onDestroy(); }  @Override protected void onPostCreate(Bundle savedInstanceState) {     super.onPostCreate(savedInstanceState);     getDelegate().onPostCreate(savedInstanceState); }  @Override protected void onPostResume() {     super.onPostResume();     getDelegate().onPostResume(); }  @Override public void onConfigurationChanged(Configuration newConfig) {     super.onConfigurationChanged(newConfig);     getDelegate().onConfigurationChanged(newConfig); }  @Override public void setContentView(@LayoutRes int layoutResID) {     getDelegate().setContentView(layoutResID); }  @Override public void setContentView(View view) {     getDelegate().setContentView(view); }  @Override public void setContentView(View view, ViewGroup.LayoutParams params) {     getDelegate().setContentView(view, params); }  @Override public void addContentView(View view, ViewGroup.LayoutParams params) {     getDelegate().addContentView(view, params); }  @Override public boolean onMenuItemSelected(int featureId, MenuItem item) {     int id = item.getItemId();     if (id == android.R.id.home) {         if (!super.onMenuItemSelected(featureId, item)) {             NavUtils.navigateUpFromSameTask(this);         }         return true;     }     return super.onMenuItemSelected(featureId, item); }  public void invalidateOptionsMenu() {     getDelegate().invalidateOptionsMenu(); }  @NonNull @Override public MenuInflater getMenuInflater() {     return getDelegate().getMenuInflater(); }  @Override protected void onTitleChanged(CharSequence title, int color) {     super.onTitleChanged(title, color);     getDelegate().setTitle(title); }  @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class AboutPreferenceFragment         extends PreferenceFragment {      private final PreferenceListener mListener = new PreferenceListener();      @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         addPreferencesFromResource(R.xml.preferences_list);          String keyList[] = getResources().getStringArray(R.array.pref_key_list);         Preference preference;         String value;         for (String pref_key : keyList) {             preference = findPreference(pref_key);             if (preference != null) {                 if (preference instanceof ListPreference) {                     value = ((ListPreference) preference).getValue();                 } else if (preference instanceof SwitchPreference) {                     value = ((SwitchPreference) preference).isChecked()                             ? "Disabled" : "Enabled";                 } else if (preference instanceof RingtonePreference) {                     value = ((RingtonePreference) preference).getShowSilent()                             ? "Enabled" : "Silent";                 } else {                     value = "";                 }                 preference.setSummary(value);                 preference.setOnPreferenceChangeListener(mListener);                 preference.setOnPreferenceClickListener(mListener);             }         }     }      private void showChangeLogDialog() {         Utilities.log(TAG, "showChangeLogDialog");         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());          WebView webView = new WebView(getActivity());         webView.loadUrl("file:///android_asset/vinoj.html");          builder.setView(webView);         builder.setNegativeButton(null, null);         builder.setPositiveButton(null, null);         builder.show();     }      private class PreferenceListener             implements Preference.OnPreferenceChangeListener,                        Preference.OnPreferenceClickListener {          @Override public boolean onPreferenceChange(Preference pPreference, Object pObject) {             Utilities.log(TAG, "onPreferenceChange: " + pPreference.getKey());             String value;             if (pPreference instanceof ListPreference) {                 value = pObject.toString();             } else if (pPreference instanceof SwitchPreference) {                 value = ((SwitchPreference) pPreference).isChecked()                         ? "Disabled" : "Enabled";             } else if (pPreference instanceof RingtonePreference) {                 value = ((RingtonePreference) pPreference).getShowSilent()                         ? "Enabled" : "Silent";             } else {                 value = pObject.toString();             }             pPreference.setSummary(value);             if (pPreference.getKey().equalsIgnoreCase(                     getString(R.string.pref_key_theme_dark))) {                 Utilities.restartApplication(getActivity());             }             return true;         }          @Override public boolean onPreferenceClick(Preference pPreference) {             String key = pPreference.getKey();             if (key == null) {                 Utilities.log(TAG, "onPreferenceClick() returning : key = null");                 return false;             }             Utilities.log(TAG, "onPreferenceClick() called key = [" + key + "]");             if (key.equalsIgnoreCase(getString(R.string.pref_key_changelog))) {                 showChangeLogDialog();             }             return true;         }     } } 

}



回答6:

Instead of:

public class PreferencesActivity extends Activity 

Do this:

public class PreferencesActivity extends AppCompatActivity 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!