PreferenceActivityのActionBar

Example: Android Market

In my application I am using the new Action Bar Compatibility sample from Google (located at /samples/android-/ActionBarCompat) which works great. The only problem I have is applying this to my PreferenceActivity in order to get a screen like the settings in the Android Market (see picture).

ActionBar にアイコンを入力するには、各アクティビティ ActionBarActivity クラスを拡張する必要があります。問題は私の Activity が既に PreferenceActivity を拡張しており、Javaクラスで複数のクラスを拡張できないことです。

PreferenceScreen と一緒に ActionBar を取得する方法が必要です。もし誰かがこの共通の問題の解決法を提供できれば嬉しいです。

PS: PreferenceScreenにボタンを追加する方法のようなソリューション ActionBar は実際にはタイトルバーであるため、これは合わない。

12
必要に応じて、私が作ったライブラリを試すことができます: github.com/AndroidDeveloperLB/MaterialStuffLibrary
追加された 著者 android developer,
多くのハッキングやリフレクションがあると、熟練したプログラマーがそれを行うことができます。私は試みた - 私は失敗した。
追加された 著者 user1974640,
私は正式なPreferenceFragmentを稼働させました!
追加された 著者 user1974640,
このスレッドを見て、私はそれがあなたを助けるだろうと思う: stackoverflow.com/questions/2697233/… [1]: stackoverflow.com/questions/2697233/…
追加された 著者 thalsharif,

8 答え

Edit: My answer below is rather hacky and it seems like it is now outdated (for pre Android 3.0) Have a look at the other answers for less hacky and more current solutions ~pyko 2014-09-01


私はそれがうまく動作するように管理しました - これが最もきれいなソリューションであるかどうかはわかりませんが、機能します。

以下の変更を加えなければならなかった:

  1. Make a copy of ActionBarActivity and have the new class extend PreferenceActivity

    public abstract class ActionBarPreferenceActivity extends PreferenceActivity {
       //contents exactly the same as 'ActionBarActivity'
    }
    
  2. Modify onCreate() in ActionBarHelperBase.java slightly - make a special case for PreferenceActivity classes

    @Override
    public void onCreate(Bundle savedInstanceState) {
       //If the activity is a PreferenceActivity, don't make the request
        if (!(mActivity instanceof PreferenceActivity)) {
            mActivity.requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
        }
    
  3. Have your PreferenceActivity extend this class and add request for FEATURE_CUSTOM_TITLE before you call super.onCreate()

    public class MyPreferenceActivity extends ActionBarPreferenceActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);//add this line
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
           //etc etc
        }
    
       //etc etc
    }
    

私が知る限り、 PreferenceActivity のために変更2と3が必要です。

"super.onCreate()を呼び出すと、ViewGroupが設定されるので、ウィンドウのパラメータを変更することはできません。" 回答へのOliverのコメントを参照)

PreferenceActivity アクティビティのコンポーネントがどのように作成されるかは、プレーンなアクティビティアクティビティとは異なると思います。

15
追加された
PreferenceFragmentにロードするだけの通常のアクションバーアクティブを設定すると、これが実行されます。誰かがここに来るが、この単純な解決策を考えなかった場合。
追加された 著者 CQM,
「ActionBarActivityのコピーを作成する」と言うと、ソースコードを自分のプロジェクトにコピーすることを意味しますか?たとえば、ここからですか? アンドロイド。 googlesource.com/platform/frameworks/support/+/…
追加された 著者 Someone Somewhere,
おそらくこれは一度に動作しますが、appcompat-v7_19.1.0で ActionBarActivity#onCreate ActionBarActivityDelegate.createDelegate(ActionBarActivity)this を呼び出します。つまり、 PreferenceActivity サブクラスを渡すことはできません。
追加された 著者 William,
これを試していただきありがとうございます。これにはクリーンな解決策がないようです。アクションバーの実装には、Androidの互換性アクションバーよりもはるかに多くの機能を提供する ActionBarSherlock を使用しています。
追加された 著者 Matthias Robbers,
この作業を行うために、アンドロイドのapiバージョンが3.0(= 11)以下であるかどうかを確認しなければなりません。そうしないと動作しませんでした。ですから、プリファレンスクラスでは、super.onCreate(...)の前にこれを行う必要があります:if(ContextUtils.getAndroidApiVersion()
追加された 著者 dirkvranckaert,

support-v4 Fragmentに基づいてPreferenceFragment実装を試したい場合:

https://github.com/kolavar/android-support-v4-preferencefragment

私は自分自身でそれを使用していますし、PreferenceActivityをPreferenceFragmentに変換することは多くありません。

5
追加された
ワオ!!この男は Google epic fail を修正しました。ありがとう、+1
追加された 著者 Kling Klang,

ActionBarActivityのコードをクローンして、 "extends Activity"を "extends PreferenceActivity"に変更できますか?次に、ActionBarActivityの代わりに新しいクラスを拡張します。

しかし、私が見たすべてのGoogleアプリから、PreferenceActivityのアクションバーにボタンを配置するのは珍しいようだ。ボタンを置いていない場合は、値-v11代替スタイルリソースを使用してホロテーマを表示し、そのスタイルをマニフェストのPreferenceActivityに設定することができます。

1
追加された
いいえ、 ActionBarActivityDelegate
追加された 著者 user1974640,

I used in my application this actionbar https://github.com/johannilsson/android-actionbar and it's work great with this thread How to add a button to PreferenceScreen

1
追加された
ありがとう。私は現在 ActionBarSherlock を使用しています。このライブラリの最初のバージョンでは、johannilssonのActionbarが基本となりました。
追加された 著者 Matthias Robbers,

@pykoに感謝したいと思いますが、HoneyComb以上ではうまくいかないという問題があります。まあ、あなたは@AndroidDevのようにそれを得るためにハックの方法を持つことができます;  しかし、@pykoは、ActionBarHelperBaseクラスを汚染し、@AndroidDevはあまり透明ではありません.PreferenceActivityから拡張されたActionBarActivityPreferencesを作成することをお勧めします。 onCreateメソッドで、親メソッドを呼び出す順序を変更します。

@Override
protected void onCreate(Bundle savedInstanceState) {
    //IMPORTATNT: MAKE SURE actionBarHelper called before super;
    //as super oncreate of prefenceactivity is actuallying setting the content view
    mActionBarHelper.onCreate(savedInstanceState);
    super.onCreate(savedInstanceState);
}

なぜ呼び出す 'mActionBarHelper.onCreate(savedInstanceState);' 「super.onCreate(savedInstanceState);」の前にこれは、super(つまりPreferenceActivity)がonCreateメソッドでコンテンツビューを実際に設定しているためです(コンテンツを追加する前にrequestFeature()を呼び出す必要があります)。確かに 'mActionBarHelper.onCreate(savedInstanceState);'スーパーの前に呼び出されます。  このように、 'ActionBarHelperBase'を汚染する必要はありませんが、 'ActionBarActivityPreferences'およびbangにトリッキーな詳細をカプセル化するため、SettingActivityをきれいに保ちます。

1
追加された

以下の変更により、プリファレンス・アクティビティーにアクション・バーを簡単に追加できます。

AndroidManifest.xml


In v21/styles.xml


Back APIサポートの v14/styles.xml


1
追加された

ありがとう、ちょうどアップデート、HoneyComb以上をサポートするためにカスタムタイトル行の前にifステートメントを追加する必要があります。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB)
   requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
0
追加された

あなたはActionBarSherlockライブラリを手に入れて、SherlockPreferenceを拡張することができます。

0
追加された