簡體   English   中英

為什么我的SwitchPreference在方向上發生故障?

[英]Why does my SwitchPreference glitch on orientation change?

我有一個活動(擴展了AppCompatActivity),其中包含帶有我的應用程序設置的PreferenceFragment 第一個設置是用於啟用或禁用通知的SwitchPreference,其后是依賴於該SwitchPreference的其他首選項。

我的問題是這樣的:我發現,如果我旋轉設備(導致方向改變)然后點擊開關,則無法正確渲染-似乎顯示了兩個重疊的開關( 這是Moto X的屏幕截圖 ),其中一個處於舊位置,一個處於新位置。 有趣的是,這甚至在較舊的開關樣式中也會發生( 這是運行JellyBean的Nexus S的屏幕截圖 )。

據我所知,我尚未在互聯網上找到有關此錯誤的任何信息,在Android OS應用程序(例如“設置”)或其他第三方應用程序(例如“ Intent Intercept by Intrications”)中都沒有發生。 所以看來我在這里做錯了。

這是我的SettingsFragment中的設置代碼:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);

        // Grab Preference objects
        final Preference wklyRemPref = findPreference(getString(R.string.prefkey_weekly_reminder));

        // Set up notification settings
        findPreference(getString(R.string.prefkey_allow_notifs))
                .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                    @Override
                    public boolean onPreferenceChange(Preference preference, Object newValue) {
                        if (Boolean.FALSE.equals(newValue)) {
                            // Turn off and disable "Weekly Reminder" pref
                            ((TwoStatePreference) wklyRemPref).setChecked(false);
                            // (Disabling is done by the system because the "Weekly Reminder"
                            // preference depends on the "Notifications" preference)
                        }
                        return true;
                    }
                });
        wklyRemPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                Log.d("Pref", preference + " value changed (" + newValue + ")");
                return true;
            }
        });
        ...
    }

這是我的settings.xml文件:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory android:title="Reminders">
        <SwitchPreference
            android:defaultValue="true"
            android:key="@string/prefkey_allow_notifs"
            android:title="@string/allow_notifs"/>
        <!-- Weekly reminder: -->
        <CheckBoxPreference
            android:dependency="@string/prefkey_allow_notifs"
            android:defaultValue="true"
            android:key="@string/prefkey_weekly_reminder"
            android:summary="Remind me weekly to choose a scripture"
            android:title="Weekly reminder" />
        <net.danmercer.ponderizer.settings.ReminderPreference
            android:defaultValue="sunday/17:00"
            android:dependency="@string/prefkey_weekly_reminder"
            android:key="@string/prefkey_weekly_reminder_time"
            android:title="Set weekly reminder time" />
        <!-- Notification preferences -->
        <RingtonePreference
            android:dependency="@string/prefkey_allow_notifs"
            android:key="@string/prefkey_notif_sound"
            android:title="Notification Sound"
            android:ringtoneType="notification"
            android:showDefault="true"
            android:showSilent="true"/>
        <CheckBoxPreference
            android:defaultValue="true"
            android:dependency="@string/prefkey_allow_notifs"
            android:key="@string/prefkey_notif_vibrate"
            android:title="Vibrate" />
    </PreferenceCategory>
    ...
</PreferenceScreen>

編輯:我也曾嘗試清理並重建我的項目,然后卸載並重新安裝該應用程序,但無濟於事。

編輯2:我嘗試使用CheckBoxPreference而不是SwitchPreference並遇到相同的問題。 更糟糕的是,我發現旋轉活動時似乎可以將整個片段燒入屏幕(可以這么說)。 我可以滾動設置片段,但是之前的影子仍然存在。 該工件先前顯示為兩個重疊的開關,​​但我沒有意識到它是如此普遍。

我發現了問題。 在我的SettingsActivity onCreate()方法中,我有如下代碼:

FragmentManager fm = getFragmentManager();
fm.beginTransaction()
        .replace(R.id.frag_container, new SettingsFragment())
        .commit();

我將replace()調用更改為add()調用,現在它可以正常工作了。 似乎在更改方向后重新創建時, 該活動在布局中添加了兩個相同的片段 使用replace解決了該問題,因為它不會向活動添加多個片段。 故事的寓意:如有疑問,請使用replace() ,而不要使用add()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM