使用android-support-v4替代PreferenceFragment

时间:2012-03-20 08:17:02

标签: android android-fragments

我突然停止了应用程序的开发,因为我意识到这个库中不支持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)的东西?

9 个答案:

答案 0 :(得分:127)

我知道这是一个老问题,但您现在可以使用com.android.support:preference-v7:23.3.0中的PreferenceFragmentCompat

答案 1 :(得分:85)

更新 - 2015年11月6日

Support-v7库现在包含PreferenceFragmentCompat。所以使用它会更好。


将以下项目作为库项目添加到您的应用程序中。

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

您可以按原样保留包括片段交易在内的所有内容。导入PreferenceFragment类时,请确保使用正确的导入标题。

import android.support.v4.preference.PreferenceFragment;

而不是

import android.preference.PreferenceFragment;

答案 2 :(得分:16)

重要更新: v7 support library的{​​{3}}现在有一个原生latest revision

我正在使用PreferenceFragmentCompat,其AAR中有mavenCentral,因此如果您使用的是Gradle,则可以轻松将其包含在内。

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

答案 3 :(得分:10)

您可以使用我自己的PreferenceFragment

这很简单,到目前为止我没有任何问题。我认为你只能在一个Activity中一次显示其中一个,这应该没问题。

答案 4 :(得分:8)

Preferences Support Library: Preference Fragments for API 7+, no matter the Activity

一个简单的实现包括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

答案 5 :(得分:7)

您可以使用真实的活动并使用片段,但我不认为这是一个不错的选择。您应该使用简单的PreferenceActivity并等待retro compat libs的改进。

答案 6 :(得分:2)

您可以使用UnifiedPreferences等第三方库为所有Android版本使用单个API。

答案 7 :(得分:0)

您可以从PreferenceActivity进行扩展,如果您希望拥有ActionBar,则可以使用Toolbar添加它,因为它位于用于首选项的ListView之上。

这可以通过使用包含工具栏的垂直LinearLayout和带有 android:id =&#34; @android:id / list&#34; 的ListView来完成。

如果您愿意,可以查看我的解决方案here

答案 8 :(得分: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。 但是,您可能遇到主题问题。如果是这种情况,你可以考虑这篇文章来解决它:

Solution to make the lib work on API 7+ while keeping material theme on API 14+