android-support-v4でのPreferenceFragmentの代替


90

PreferenceFragmentsがこのライブラリでサポートされていないことに気付いたので、アプリの開発が突然停止しました。新人のAndroid開発者がこの障害を克服するために使用できる代替手段はありますか?

これが今の私のメインウィンドウです

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<TabHost
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0"/>

        <FrameLayout
            android:id="@+android:id/realtabcontent"
            android:layout_width="fill_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    </LinearLayout>

                <TabWidget
            android:id="@android:id/tabs"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            />

</TabHost>
</LinearLayout>

私のTabActivityでは、オンラインで見つけたものを使用しています。これがスニペットです:

public class TabControlActivity extends FragmentActivity implements TabHost.OnTabChangeListener 
{
public static final int INSERT_ID = Menu.FIRST;
public static TabControlActivity thisCtx;
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap();
private TabInfo mLastTab = null;

private class TabInfo {
     private String tag;
     private Class clss;
     private Bundle args;
     private Fragment fragment;
     TabInfo(String tag, Class clazz, Bundle args) {
         this.tag = tag;
         this.clss = clazz;
         this.args = args;
     }

}

class TabFactory implements TabContentFactory 
{

    private final Context mContext;

    /**
     * @param context
     */
    public TabFactory(Context context) {
        mContext = context;
    }

    /** (non-Javadoc)
     * @see android.widget.TabHost.TabContentFactory#createTabContent(java.lang.String)
     */
    public View createTabContent(String tag) {
        View v = new View(mContext);
        v.setMinimumWidth(0);
        v.setMinimumHeight(0);
        return v;
    }

}

...*snip*...

android-support-v4互換性ライブラリを使用して、preferencefragment(またはpreferenceActivity)に似たものを実装するものはありますか?



これらの設定をタブホスト内に表示する必要がある状況にいるため、実際には重複していません。私の編集を参照してください
CodePrimate 2012年

私の更新された答えをください。PreferenceFragmentCompat最近サポートライブラリに追加されました。
theblang 2015

回答:


86

更新-2015年6月11日

Support-v7ライブラリにが含まれるようになりましたPreferenceFragmentCompat。したがって、それを使用することをお勧めします。


次のプロジェクトをライブラリプロジェクトとしてアプリケーションに追加します。

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

フラグメントトランザクションを含むすべてをそのまま維持できます。PreferenceFragmentクラスをインポートするときは、正しいインポートヘッダーがユーザーであることを確認してください。

import android.support.v4.preference.PreferenceFragment;

の代わりに

import android.preference.PreferenceFragment;

4
そのgithubコードには深刻な問題があるようです...私は使用できず、変更RingtonePreferenceOnSharedPreferenceChangeListenerないようです!
madlymad 2014年

2
このライブラリを使うのはいいことだと思っていました。しかし、思ったほど良くないことに気づきました。onPrepareOptionMenuメソッドをオーバーライドしようとすると、私voidたち全員が知っているデフォルトの署名(returns )とは異なる奇妙な署名(returns )が表示されますboolean!!! 深刻な問題。
S.Thiongane 2014

9
あなたはマドリードに来るたびに無料のディナーを受け取る権利があります...この問題は私を夢中にさせていました!
2014年

7
@mansoulx onPrepareOptionsMenuのフラグメントには常にvoidの戻り値の型があり(ブール値であるアクティビティとは異なります)、このシグネチャは完全に期待どおりです。
クンバヤ2014

3
ライブラリの問題は、おそらくgithubプロジェクトで報告されるはずです。
Mathijs Segers 2015年

128

これは古い質問であることはわかっていますが、今PreferenceFragmentCompatから使用できますcom.android.support:preference-v7:23.3.0


4
これは正解の1つです。
Mythul

私にとっては、com.android.support:preference-v7:23.0.1でのみ機能します。
Felipe Mosso、2015年

1
これは、Android Studioから追加しようとしたときに、依存関係サーバー上にないようです。リポジトリを追加する必要がありますか?
Brill Pappin、2015年

そのクラスは含まれていません
JJ Ab

1
私は誤ってこの回答に賛成してしまい、今は元に戻せないので、代わりに、PreferenceFragmentCompatいくつかの大きな問題があることに注意します。たとえば、これこのバグレポート、およびその他の多くの記事を参照してください。PreferenceActivity代わりに廃止予定を使用してしまいました。ため息
Vicky Chijwani 2016年

16

重要な更新:現在の最新リビジョンv7 support libraryは、ネイティブのPreferenceFragmentCompatがあります。

私はこのライブラリを使用しています。これにはAARin mavenCentralが含まれているので、使用している場合は簡単に組み込むことができますGradle

compile 'com.github.machinarius:preferencefragment:0.1.1'


サポートフラグメントをインポートおよび拡張する方法を教えてください。ありがとう
Steven

1
@Steve Sure!要旨を作りまし
theblang 2014

@mattblangありがとうございます!
Steven

@mattblangありがとうございました...あなたの助けによって本当に私の時間を大幅に節約できます
Asad Ullah Rafiq

Exception java.lang.RuntimeException:Content has view with id attribute 'android.R.id.list' that is not a ListView class
Abdul Rahman

10

自分で使えますPreferenceFragment

シンプルで、今のところ問題はありません。1つのアクティビティでは一度に1つしか表示できないと思いますが、これは問題ありません。


9

設定サポートライブラリ:アクティビティに関係なく、API 7+の設定フラグメント

単純な実装には、次のようなPreferenceFragmentCompatが含まれます。

public class PreferencesFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preferences);
    }
}

また、テーマにpreferenceThemeを設定する必要があります。

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

そして、これを依存関係に追加します:http : //developer.android.com/tools/support-library/features.html

com.android.support:preference-v14:23.1.0

7

あなたはおそらく実際のアクティビティを使用してフラグメントを使用することができますが、それは良い選択ではないと思います。単純なPreferenceActivityを使用して、レトロ互換ライブラリの改善を待つ必要があります。


1
アプリの残りの部分はタブウィジェットで構成されているため、PreferenceActivityを使用できません。設定フラグメントは、タブウィジェットの上に表示されることになっています。代わりにそれをアクティビティにして、画面全体を占めるようにしました。
CodePrimate 2012年

2
次に、カスタムリストフラグメントをいくつか使用します
zapl


0

代わりにPreferenceActivityから拡張でき、ActionBarが必要な場合は、ツールバーを使用して追加できます。を使用して、設定に使用されているListViewの上に。

これは、ツールバーとandroid:id = "@ android:id / list"を含むListViewを保持する垂直LinearLayoutを使用して行うことができます

あなたが望むなら、あなたは私の解決策を見ることができます ここでます


0

Luciusが言ったように、PreferenceFragmentCompatを使用できます。

public class MyPreferenceFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle bundle, String s) {               
            PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
            addPreferencesFromResource(R.xml.preferences);
       }
}

その依存関係をgradleに含める必要があります:

dependencies {
...
    compile 'com.android.support:preference-v7:23.1.X' (wherX = 0,1,...)
...
}

このように、android.support.v4.app.FragmentTransactionとPrefernceFragmentのFragmentTransactionを使用することもできます。ただし、テーマに問題がある可能性があります。その場合は、この投稿を考慮に入れて解決できます。

API 14+のマテリアルテーマを維持しながら、API 7+でlibを機能させるソリューション

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.