gpt4 book ai didi

android - 内部 PreferenceScreen 不使用 PreferenceFragmentCompat 打开

转载 作者:IT老高 更新时间:2023-10-28 22:20:31 25 4
gpt4 key购买 nike

我的 PreferenceFragmentCompat 内部 PreferenceScreen 没有显示,或者似乎忽略了点击事件。

我创建了 MyPreferenceFragment,它扩展了 PreferenceFragmentCompat

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

然后我在 styles.xml 中更改了我的主题,例如

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

最后创建我的 preferences.xml 文件,如

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference android:title="Check Me"/>
<PreferenceScreen android:title="My Screen"> <!-- This is not opening -->
<EditTextPreference android:title="Edit text" />
</PreferenceScreen>
</PreferenceScreen>

build.gradle 我都添加了:

compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:preference-v7:23.0.1'

Activity 代码

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

activity_main.xml

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment"
android:name="com.mando.preferenceapp.MyPreferenceFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />

测试上面的代码我无法打开/进入首选项屏幕。我错过了什么吗?为什么这不起作用?

最佳答案

在花费大量时间尝试、搜索并感谢支持库创建者的帮助之后。我已经成功了。

第 1 步。 Activity

public class MyActivity extends AppCompatActivity implements
PreferenceFragmentCompat.OnPreferenceStartScreenCallback {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
// Create the fragment only when the activity is created for the first time.
// ie. not after orientation changes
Fragment fragment = getSupportFragmentManager().findFragmentByTag(MyPreferenceFragment.FRAGMENT_TAG);
if (fragment == null) {
fragment = new MyPreferenceFragment();
}

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment, MyPreferenceFragment.FRAGMENT_TAG);
ft.commit();
}
}

@Override
public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat,
PreferenceScreen preferenceScreen) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
MyPreferenceFragment fragment = new MyPreferenceFragment();
Bundle args = new Bundle();
args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey());
fragment.setArguments(args);
ft.replace(R.id.fragment_container, fragment, preferenceScreen.getKey());
ft.addToBackStack(preferenceScreen.getKey());
ft.commit();
return true;
}
}

提示。

  • 不要通过 xml 添加 fragment ,否则会在方向更改时崩溃。
  • onCreate 中处理 Activity/fragment 添加的重新创建,以避免在偏好屏幕内丢失 fragment 。
  • fragment 的宿主 Activity 应该实现 PreferenceFragmentCompat.OnPreferenceStartScreenCallback 并重新创建同一实例的 fragment 。

第 2 步。 PreferenceFragment

public class MyPreferenceFragment extends PreferenceFragmentCompat {

public static final String FRAGMENT_TAG = "my_preference_fragment";

public MyPreferenceFragment() {
}

@Override
public void onCreatePreferences(Bundle bundle, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
}

}

提示。

  • 使用方法 setPreferencesFromResource 并利用每个屏幕的 rootKey。这样您的代码将被正确地重用。
  • 请记住,如果您的 fragment 中有 findPreference 之类的代码,它应该有 null 检查,因为当您在内部屏幕中时,这不会给您任何信息。<

现在缺少的是在操作栏中执行后退箭头(主页操作),但这永远不会单独工作;-)

我还创建了一个包含所有这些代码的演示应用程序,您可以在 github 上找到它.

关于android - 内部 PreferenceScreen 不使用 PreferenceFragmentCompat 打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32487206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com