これが私の好みの活動です:
package com.example.hms.test;
import Android.os.Bundle;
import Android.preference.PreferenceActivity;
public class PrefsActivity extends PreferenceActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
}
}
ここでは、名前設定とホームへの戻るボタンを備えたアクションバーを表示したいと思います
あなたはいくつかのことをすべきです:
PreferenceActivityのonCreateに以下を追加します。
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
PreferenceActivityのonOptionsItemSelectedをオーバーライドします。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case Android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
変更 <activity>
PreferenceActivityのマニフェストのタグは次のようになります。
<activity
Android:name=".PrefsActivity"
Android:label="@string/title_activity_settings"
Android:parentActivityName=".MainActivity">
<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value="com.example.Android.MainActivity" />
</activity>
最後に、Android:launchMode = "singleTop"をMainActivityに配置します<activity>
マニフェストのタグ:
<activity
Android:name=".MainActivity"
Android:label="@string/app_name"
Android:launchMode="singleTop"
Android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Pooyaが出した答えは、PreferenceActivityでは機能しません。代わりに、クラスでAppCompatActivityを拡張し、PreferenceFragmentを使用して設定をロードします。設定のコードは次のとおりです。
public class MyPrefsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(Android.R.id.content, new MyPreferenceFragment()).commit();
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onSupportNavigateUp(){
finish();
return true;
}
public static class MyPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}
}
アクティビティをAndroidManifest.XMLに配置します。
<activity Android:name=".MyPrefsActivity"
Android:label="Preferences"
Android:theme="@style/AppTheme"/>
これで、通常どおり、メインアクティビティ(または親アクティビティ)のインテントを使用して設定アクティビティを開始できます。
Intent prefsIntent = new Intent(activity, MyPrefsActivity.class);
activity.startActivity(prefsIntent);
アクティビティにさまざまなアクションバーメニュー項目が必要だったため、singleToplaunchModeを使用してMainActivityを作成しました。これは、子供のアクティビティのアクションバーを設定するのに最適でしたが、設定アクティビティにはアクションバーがありませんでした。
結局のところ、重要なのは、MainActivityテーマにTheme.AppCompat.Light.NoActionBarの親があることを確認することでした。
<activity
Android:name=".MainActivity"
Android:label="@string/app_name"
Android:launchMode="singleTop"
Android:theme="@style/AppTheme">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
そして、SettingsActivityテーマには親Theme.AppCompat.Light.DarkActionBarがありました。
<activity
Android:name=".SettingsActivity"
Android:label="@string/title_activity_settings"
Android:theme="@style/SettingsTheme"
Android:parentActivityName=".MainActivity">
<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value="net.deatrich.app.bodyandminddbt.MainActivity" />
</activity>
Styles.xml内
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="SettingsTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
おそらくそれをスタイリングするためのより良い方法がありますが、これは機能します。
他の人が読んでいる場合は、AppCompatPreferenceActivityからSettingsActivityを取得することも忘れないでください。
SettingsActivity.Java:
public class SettingsActivity extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// I'm displaying a fragment as the main content.
getFragmentManager().beginTransaction()
.replace(Android.R.id.content, new GeneralPreferenceFragment())
.commit();
setupActionBar();
}
private void setupActionBar() {
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@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);
}
...
はい。今でも問題が発生しますわずかな変更で100%機能する独自のソリューションがあります。
そのため、まず、設定アクティビティのみに対して1つのスタイルを作成します。
これが私のツールバースタイルコードです。
<style name="Toolbar_settings_style" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:colorControlNormal">@color/appTitleTextColor</item>
</style>
これが私のstlyes.xmlのようです
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:colorControlNormal">@color/appTitleTextColor</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
<style name="Toolbar_settings_style" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:colorControlNormal">@color/appTitleTextColor</item>
</style>
</resources>
はい。あなたは私がsettingsActivityだけのために重複したスタイル(appThemeとToolbar_settings_styleは両方とも同じスタイル属性です)を作成していることに気づきました。重複するスタイルを作成することは非常に重要です。
今settingsActivityに移動し、onCreate()内のコードの下に貼り付けます
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
上記のコードを配置した後、私のSettingsActivityは次のようになります
import Android.media.Ringtone;
import Android.media.RingtoneManager;
import Android.net.Uri;
import Android.preference.EditTextPreference;
import Android.preference.ListPreference;
import Android.preference.Preference;
import Android.preference.PreferenceFragment;
import Android.preference.PreferenceManager;
import Android.preference.RingtonePreference;
import Android.support.v7.app.ActionBar;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.support.v7.widget.Toolbar;
import Android.text.TextUtils;
import Android.view.MenuItem;
import settingspreferences.AppCompatPreferenceActivity;
public class User_Settings extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// load settings fragment
getFragmentManager().beginTransaction().replace(Android.R.id.content, new MainPreferenceFragment()).commit();
}
public static class MainPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.settings);
// gallery EditText change listener
bindPreferenceSummaryToValue(findPreference(getString(R.string.key_gallery_name)));
// notification preference change listener
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == Android.R.id.home) {
// onBackPressed();
}
return super.onOptionsItemSelected(item);
}
private static void bindPreferenceSummaryToValue(Preference preference) {
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
PreferenceManager
.getDefaultSharedPreferences(preference.getContext())
.getString(preference.getKey(), ""));
}
/**
* 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 newValue) {
String stringValue = newValue.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(R.string.summary_choose_ringtone);
} else {
// Set the summary to reflect the new ringtone display
// name.
String name = ringtone.getTitle(preference.getContext());
preference.setSummary(name);
}
}
} else if (preference instanceof EditTextPreference) {
if (preference.getKey().equals("key_gallery_name")) {
// update the changed gallery name to summary filed
preference.setSummary(stringValue);
}
} else {
preference.setSummary(stringValue);
}
return true;
}
};
}
}
それでは、本当に重要な部分に行きましょう。 manifest.xmlファイルに移動し、settingsActivityを見つけて、コードの下に貼り付けます。
<activity Android:name=".User_Settings"
Android:theme="@style/Toolbar_settings_style"></activity>
これが私のAndroidManifest.xmlのようになります
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="mypackage">
<uses-permission Android:name="Android.permission.INTERNET" />
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:roundIcon="@mipmap/ic_launcher_round"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
<!-- -->
<activity
Android:name=".MainActivity"
Android:windowSoftInputMode="adjustPan">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
<!-- <intent-filter> -->
<!-- <action Android:name="Android.intent.action.SEARCH" /> -->
<!-- </intent-filter> -->
<meta-data
Android:name="Android.app.searchable"
Android:resource="@xml/searchable" />
</activity>
<activity Android:name=".Add_Items" />
<activity Android:name=".Product_details_view" />
<activity
Android:name=".editProducts"
Android:parentActivityName=".Product_details_view" />
<activity Android:name=".User_Settings"
Android:theme="@style/Toolbar_settings_style"></activity>
</application>
</manifest>
これが、settingsActivityにツールバーを表示するために必要なすべてです。