我突然停止了应用程序的开发,因为我意识到这个库中不支持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)的东西?
答案 0 :(得分:127)
我知道这是一个老问题,但您现在可以使用com.android.support:preference-v7:23.3.0
中的PreferenceFragmentCompat
答案 1 :(得分:85)
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+