相关疑难解决方法(0)

使用support.v7.preference时,首选项子屏幕无法打开

我正在尝试使用AppCompatActivity和support.v7.preference在子屏幕上实现首选项

根据文档,另一个PreferenceScreen中的每个PreferenceScreen都用作子屏幕,框架将处理单击时显示它. http://developer.android.com/guide/topics/ui/settings.html#Subscreens

<PreferenceScreen  xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- opens a subscreen of settings -->
    <PreferenceScreen
        android:key="button_voicemail_category_key"
        android:title="@string/voicemail"
        android:persistent="false">
        <ListPreference
            android:key="button_voicemail_provider_key"
            android:title="@string/voicemail_provider" ... />
        <!-- opens another nested subscreen -->
        <PreferenceScreen
            android:key="button_voicemail_setting_key"
            android:title="@string/voicemail_settings"
            android:persistent="false">
            ...
        </PreferenceScreen>
        <RingtonePreference
            android:key="button_voicemail_ringtone_key"
            android:title="@string/voicemail_ringtone_title"
            android:ringtoneType="notification" ... />
        ...
    </PreferenceScreen>
    ...
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

这可以使用本机Activity,PreferenceFragment工作正常...但是使用AppCompatActivity和PreferenceFragmentCompat,单击Preference元素只会突出显示它,但不会打开子屏幕.

我在这个文档和代码上找不到任何东西......我需要实现任何额外的回调吗?


编辑:只是为了完整...

这可以工作并打开子屏幕:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .replace(android.R.id.content, new DemoPreferenceFragment())
                    .commit();
        }
    }

    static public class DemoPreferenceFragment extends PreferenceFragment {

        @Override …
Run Code Online (Sandbox Code Playgroud)

android android-appcompat android-preferences

25
推荐指数
2
解决办法
8011
查看次数

内部PreferenceScreen无法使用PreferenceFragmentCompat打开

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

我创造了MyPreferenceFragment那个extends PreferenceFragmentCompat

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

然后,我改变了我的主题,在styles.xml

<style name="AppTheme" parent="@style/Theme.AppCompat.Light">
  <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>
Run Code Online (Sandbox Code Playgroud)

最后创建我的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>
Run Code Online (Sandbox Code Playgroud)

build.gradle我添加了两个:

compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:preference-v7:23.0.1'
Run Code Online (Sandbox Code Playgroud)

活动的代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
Run Code Online (Sandbox Code Playgroud)

activity_main.xml中 …

android android-appcompat android-support-library preference-v7

23
推荐指数
3
解决办法
8354
查看次数

如何从PreferenceFragmentCompat中的Preferences子屏幕移回主屏幕?

我正在尝试使用PreferenceFragmentCompat实现"设置"屏幕.我的偏好xml有一个像这样的首选子屏幕:

的preferences.xml

    <CheckBoxPreference
        android:defaultValue="false"
        android:key="@string/pref_sound_key"
        android:summary="@string/pref_sound_summary"
        android:title="@string/pref_sound_title" />

    <PreferenceScreen android:title="Inner Screen">
        <CheckBoxPreference
            android:defaultValue="true"
            android:key="@string/key_1"
            android:title="@string/title_1" />

        <CheckBoxPreference
            android:defaultValue="true"
            android:key="@string/key_1"
            android:title="@string/title_1" />

        <CheckBoxPreference
            android:defaultValue="true"
            android:key="@string/key_2"
            android:title="@string/title_2" />

        <CheckBoxPreference
            android:defaultValue="true"
            android:key="@string/key_3"
            android:title="@string/title_3" />
    </PreferenceScreen>

</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)

首选主屏幕

现在,在应用程序中,子屏幕在我在父活动中实现PreferenceFragmentCompat.OnPreferenceStartScreenCallback接口之前不会打开,如PreferenceFragmentCompat doc中所指定的那样.

MainActivity.java

public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragmentCompat,
 PreferenceScreen preferenceScreen) {    
    preferenceFragmentCompat.setPreferenceScreen(preferenceScreen);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这就是问题出现的地方.在实现界面时,子屏幕打开,但是我无法找到回到第一个屏幕的方法.

偏好子屏幕

按后退键可关闭应用程序.

有什么办法我可以在应用栏上放一个后箭头,这样按下它会把主屏幕拉回来吗?

android preference-v7

10
推荐指数
1
解决办法
5513
查看次数

PreferenceFragments 不在同一个 FragmentManager 中?

我们有一个PreferenceFragmentCompat,然后点击一个首选项,我们想从当前的 切换PreferenceFragmentCompat到新的PreferenceFragmentCompat。(在新屏幕上进行某些设置)。

但是,无论我们尝试过什么,我们都会遇到以下错误:

Fragment 声明的目标片段不属于此 FragmentManager

主活动.kt

class MainActivity : AppCompatActivity(), ActivityCompat.OnRequestPermissionsResultCallback, PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val navView: BottomNavigationView = findViewById(R.id.nav_view)

        val navController = findNavController(R.id.nav_host_fragment)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        val appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_preferences
            )
        )

        setupActionBarWithNavController(navController, appBarConfiguration)
        navView.setupWithNavController(navController)
    }

    override fun onPreferenceStartFragment(caller: PreferenceFragmentCompat, pref: Preference): Boolean {
        val …
Run Code Online (Sandbox Code Playgroud)

mobile android fragment kotlin fragmentmanager

3
推荐指数
1
解决办法
366
查看次数