可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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