จะรับฟังการเปลี่ยนแปลงความชอบภายใน PreferenceFragment ได้อย่างไร


93

ตามที่อธิบายไว้ที่นี่ฉันกำลังคลาสย่อย PreferenceFragment และแสดงไว้ในกิจกรรม เอกสารนั้นจะอธิบายวิธีการรับฟังการเปลี่ยนแปลงค่ากำหนดที่นี่แต่เฉพาะในกรณีที่คุณซับคลาส PreferenceActivity เนื่องจากฉันไม่ได้ทำอย่างนั้นฉันจะรับฟังการเปลี่ยนแปลงความชอบได้อย่างไร

ฉันได้ลองใช้ OnSharedPreferenceChangeListener ใน PreferenceFragment แล้ว แต่ดูเหมือนจะไม่ได้ผล ( onSharedPreferenceChangedดูเหมือนจะไม่ได้รับการเรียก)

นี่คือรหัสของฉันจนถึงตอนนี้:

SettingsActivity.java

public class SettingsActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // Display the fragment as the main content.
        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
    }
}

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener
{
    public static final String KEY_PREF_EXERCISES = "pref_number_of_exercises";

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

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
    {
        //IT NEVER GETS IN HERE!
        if (key.equals(KEY_PREF_EXERCISES))
        {
            // Set summary to be the user-description for the selected value
            Preference exercisesPref = findPreference(key);
            exercisesPref.setSummary(sharedPreferences.getString(key, ""));
        }
    }
}

การตั้งค่า. xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <EditTextPreference
        android:defaultValue="15"
        android:enabled="true"
        android:key="pref_number_of_exercises"
        android:numeric="integer"
        android:title="Number of exercises" />

</PreferenceScreen>

นอกจากนี้ PreferenceFragment ยังเป็นสถานที่ที่เหมาะสมในการรับฟังการเปลี่ยนแปลงความชอบหรือฉันควรทำภายในกิจกรรม


1
สำหรับคำถามสุดท้ายของคุณทุกอย่างขึ้นอยู่กับกรอบการออกแบบของคุณ ในการใช้แนวทาง MVC หรือ MVP นั้นยากที่จะทำกับ Android แต่ฉันพยายามให้การกระทำทั้งหมดของฉันเกิดขึ้นในกิจกรรม (คอนโทรลเลอร์) ที่โฮสต์แฟรกเมนต์และแฟรกเมนต์เป็น UI เท่านั้น (View / Presenter)
John Shelley

คำตอบ:


151

ฉันเชื่อว่าคุณต้องลงทะเบียน / ยกเลิกการลงทะเบียนListenerในของคุณPreferenceFragmentและมันจะได้ผล

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

}

@Override
public void onPause() {
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}

ขึ้นอยู่กับสิ่งที่คุณต้องการทำคุณอาจไม่จำเป็นต้องใช้ผู้ฟัง การเปลี่ยนแปลงการกำหนดลักษณะจะกระทำSharedPreferencesโดยอัตโนมัติ


ฉันเห็น ที่ได้ผล แต่ฉันควรจะได้รับ SharedPreferences ผ่านทางgetPreferenceManager(เช่นเดียวกับที่คุณทำ) หรือgetPreferenceScreenไม่? อะไรคือความแตกต่าง?
XåpplI'-I0llwlg'I -

พูดตามตรงฉันไม่แน่ใจว่าความแตกต่างที่แท้จริงคืออะไรบางทีอาจมีคนอื่นมาชั่งน้ำหนักมันอาจเป็นหัวข้อที่ดีสำหรับคำถามอื่นเช่นกัน
ล่วงหน้า

2
เอาล่ะนี่คือคำตอบสำหรับคำถามนั้น ดูเหมือนว่าจะไม่มีความแตกต่างในการใช้งาน แต่getPreferenceManagerโดยทั่วไปแล้วเป็นตัวเลือกที่ต้องการ
XåpplI'-I0llwlg'I -

เมื่อสร้างการตั้งค่า - ความชอบเป็นครั้งแรกสรุปจะไม่ถูกตั้งค่าตามค่าการกำหนดลักษณะที่จัดเก็บไว้ วิธีแก้ปัญหานี้ ??
srv_sud

1
@srv_sud คุณหมายถึงkeyพารามิเตอร์ควรเป็นอย่างไร onSharedPreferenceChanged(null, "")ไม่ได้พยายามนี้คุณมีตัวอย่างในคำตอบของกุนนาร์ด้านล่าง: อาจไม่เหมาะกับความต้องการของคุณ บางทีคุณควร
ทบทวน

24

โซลูชันของแอนติวทำงานได้ดีที่นี่คุณสามารถดูกิจกรรมการตั้งค่าทั้งหมดสำหรับ Android v11 เป็นต้นไป:

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.PreferenceFragment;

public class UserPreferencesV11 extends Activity  {

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

    // Display the fragment as the main content.
    getFragmentManager().beginTransaction().replace(android.R.id.content,
            new PrefsFragment()).commit();
}

public static class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {

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

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);

        // set texts correctly
        onSharedPreferenceChanged(null, "");

    }

    @Override
    public void onResume() {
        super.onResume();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // just update all
        ListPreference lp = (ListPreference) findPreference(PREF_YOUR_KEY);
        lp.setSummary("dummy"); // required or will not update
        lp.setSummary(getString(R.string.pref_yourKey) + ": %s");

    }
}
}

ไม่มีสิ่งนี้ในคลาสคงที่!
josef

คุณสามารถอธิบายได้หรือไม่? ฉันไม่รู้เลยว่า "สิ่งนี้" ที่คุณอ้างถึงคืออะไร คำตอบคือ 7 ปี แอนดรอยด์เปลี่ยนไปมาก
Gunnar Bernstein

PrefsFragment คลาสคงที่สาธารณะประกาศคลาสแบบคงที่จากนั้นใช้ภายในนี้เพื่ออ้างอิงตัวเอง แต่เป็นไปไม่ได้คุณไม่สามารถใช้สิ่งนี้ภายในคลาสแบบคงที่
โจเซฟ

คุณแน่ใจหรือไม่ว่าคุณเข้าใจแนวคิดของคลาสภายในแบบคงที่ใน Java? คลาสที่ซ้อนกันแบบคงที่อาจถูกสร้างอินสแตนซ์โดยไม่ต้องสร้างอินสแตนซ์คลาสภายนอก การใช้ 'this' ทำได้ดีมาก นี่ไม่ใช่ C #!
Gunnar Bernstein

ฉันไม่แน่ใจ แต่ฉันลองใช้รหัสใน Android Studio แล้วมันก็บ่นว่า: "getPreferenceScreen (). getSharedPreferences (). registerOnSharedPreferenceChangeListener (this);". ฉันต้องเขียนโค้ดใหม่เพื่อให้คอมไพล์
josef

16

คำตอบอื่น ๆ ทั้งหมดถูกต้อง แต่ฉันชอบทางเลือกนี้ดีกว่าเพราะคุณมีอินสแตนซ์ค่ากำหนดที่ทำให้เกิดการเปลี่ยนแปลงทันที

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Preference pref = findPreference(getString(R.string.key_of_pref));        
    pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            // do whatever you want with new value

            // true to update the state of the Preference with the new value
            // in case you want to disallow the change return false
            return true;
        }
    });
}

ถูกต้องแม้ว่าonSharedPreferenceChanged ()คุณจะสามารถเข้าถึงอินสแตนซ์ Preference ได้อย่างง่ายดายด้วยfindPreference(key)ไฟล์. SharedPreferencesวิธีนี้อาจเป็นที่ต้องการเนื่องจากสิ่งที่ลงทะเบียน / ไม่ได้ลงทะเบียน?
Jose_GD

2

สิ่งนี้ใช้ได้ผลสำหรับฉันจาก PreferenceFragment.onCreate ()

OnSharedPreferenceChangeListener listener = 
    new SharedPreferences.OnSharedPreferenceChangeListener()
    {
        public void onSharedPreferenceChanged(SharedPreferences prefs, String key)
        {
         showDialog();
        }
    };

1

นี่คือวิธีหนึ่งในการดำเนินการและหลีกเลี่ยงการรั่วไหลของหน่วยความจำที่อาจเกิดขึ้น:

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    addPreferencesFromResource(R.xml.pref_movies);

    SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences(); 

    //starts live change listener
    sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onDestroyView () {
    super.onDestroyView(); 
//Unregisters listener here
    PreferenceManager.getDefaultSharedPreferences(getContext())
            .unregisterOnSharedPreferenceChangeListener(this);
}

0

อีกตัวอย่างที่สมบูรณ์เพื่อให้คุณเห็นภาพทั้งหมด

public class SettingsActivity extends AppCompatPreferenceActivity {


    /**
     * A preference value change listener that updates the preference's summary
     * to reflect its new value.
     */
    private static Preference.OnPreferenceChangeListener
            sBindPreferenceSummaryToValueListener =
            new Preference.OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange(Preference preference, Object value) {
                    String stringValue = value.toString();

                    if (preference instanceof ListPreference) {
                        // For list preferences, look up the correct display value in
                        // the preference's 'entries' list.
                        ListPreference listPreference = (ListPreference) preference;
                        int index = listPreference.findIndexOfValue(stringValue);

                        // Set the summary to reflect the new value.
                        preference.setSummary(
                                index >= 0
                                        ? listPreference.getEntries()[index]
                                        : null);

                    } else if (preference instanceof RingtonePreference) {
                        // For ringtone preferences, look up the correct display value
                        // using RingtoneManager.
                        if (TextUtils.isEmpty(stringValue)) {
                            // Empty values correspond to 'silent' (no ringtone).
                            preference.setSummary(R.string.pref_ringtone_silent);
                        } else {
                            Ringtone ringtone = RingtoneManager.getRingtone(
                                    preference.getContext(), Uri.parse(stringValue));
                            if (ringtone == null) {
                                // Clear the summary if there was a lookup error.
                                preference.setSummary(null);
                            } else {
                                // Set the summary to reflect the new ringtone display
                                // name.
                                String name = ringtone.getTitle(preference.getContext());
                                preference.setSummary(name);
                            }
                        }

                    } else {
                        // For all other preferences, set the summary to the value's
                        // simple string representation.
                        preference.setSummary(stringValue);
                    }
                    return true;
                }
            };

    /**
     * Helper method to determine if the device has an extra-large screen. For
     * example, 10" tablets are extra-large.
     */
    private static boolean isXLargeTablet(Context context) {
        return (context.getResources().getConfiguration().screenLayout
                & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
    }

    /**
     * Binds a preference's summary to its value. More specifically, when the
     * preference's value is changed, its summary (line of text below the
     * preference title) is updated to reflect the value. The summary is also
     * immediately updated upon calling this method. The exact display format is
     * dependent on the type of preference.
     *
     * @see #sBindPreferenceSummaryToValueListener
     */
    private static void bindPreferenceSummaryToValue(Preference preference) {
        // Set the listener to watch for value changes.
        preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

        // Trigger the listener immediately with the preference's current value.
        sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
                PreferenceManager
                        .getDefaultSharedPreferences(preference.getContext())
                        .getString(preference.getKey(), ""));
    }

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

    /**
     * Set up the {@link android.app.ActionBar}, if the API is available.
     */
    private void setupActionBar() {
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            // Show the Up button in the action bar.
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        int id = item.getItemId();
        if (id == android.R.id.home) {
            if (!super.onMenuItemSelected(featureId, item)) {
                NavUtils.navigateUpFromSameTask(this);
            }
            return true;
        }
        return super.onMenuItemSelected(featureId, item);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean onIsMultiPane() {
        return isXLargeTablet(this);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.pref_headers, target);
    }

    /**
     * This method stops fragment injection in malicious applications.
     * Make sure to deny any unknown fragments here.
     */
    protected boolean isValidFragment(String fragmentName) {
        return PreferenceFragment.class.getName().equals(fragmentName)
                || GPSLocationPreferenceFragment.class.getName().equals(fragmentName)
                || DataSyncPreferenceFragment.class.getName().equals(fragmentName)
                || NotificationPreferenceFragment.class.getName().equals(fragmentName);
    }

    ////////////////// NEW PREFERENCES ////////////////////////////

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class GPSLocationPreferenceFragment extends PreferenceFragment {

        Preference prefGPSServerAddr, prefGPSASDID, prefIsGPSSwitch;

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

            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
            // to their values. When their values change, their summaries are
            // updated to reflect the new value, per the Android Design
            // guidelines.

            bindPreferenceSummaryToValue(findPreference("gpsServer_Addr"));
            bindPreferenceSummaryToValue(findPreference("gpsASD_ID"));


            prefGPSServerAddr = findPreference("gpsServer_Addr");
            prefGPSServerAddr.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {

                    try {
                        // do whatever you want with new value

                    }
                    catch (Exception ex)
                    {
                        Log.e("Preferences", ex.getMessage());
                    }

                    // true to update the state of the Preference with the new value
                    // in case you want to disallow the change return false
                    return true;
                }
            });

            prefGPSASDID = findPreference("gpsASD_ID");
            prefGPSASDID.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {

                    try {
                        // do whatever you want with new value

                    }
                    catch (Exception ex)
                    {
                        Log.e("Preferences", ex.getMessage());
                    }

                    // true to update the state of the Preference with the new value
                    // in case you want to disallow the change return false
                    return true;
                }
            });

            prefIsGPSSwitch = findPreference("isGPS_Switch");
            prefIsGPSSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {

                    try {
                        // do whatever you want with new value

                    }
                    catch (Exception ex)
                    {
                        Log.e("Preferences", ex.getMessage());
                    }

                    // true to update the state of the Preference with the new value
                    // in case you want to disallow the change return false
                    return true;
                }
            });
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
                if (tabletSize) {
                    startActivity(new Intent(getActivity(), MainActivity.class));
                } else {
                    startActivity(new Intent(getActivity(), SettingsActivity.class));
                }
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

    ///////////////////////////////////////////////////////////////

    /**
     * This fragment shows notification preferences only. It is used when the
     * activity is showing a two-pane settings UI.
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class NotificationPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_notification);
            setHasOptionsMenu(true);

            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
            // to their values. When their values change, their summaries are
            // updated to reflect the new value, per the Android Design
            // guidelines.
            bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
                if (tabletSize) {
                    startActivity(new Intent(getActivity(), MainActivity.class));
                } else {
                    startActivity(new Intent(getActivity(), SettingsActivity.class));
                }
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }

    /**
     * This fragment shows data and sync preferences only. It is used when the
     * activity is showing a two-pane settings UI.
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public static class DataSyncPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_data_sync);
            setHasOptionsMenu(true);

            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
            // to their values. When their values change, their summaries are
            // updated to reflect the new value, per the Android Design
            // guidelines.
            bindPreferenceSummaryToValue(findPreference("sync_frequency"));
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            int id = item.getItemId();
            if (id == android.R.id.home) {
                boolean tabletSize = getResources().getBoolean(R.bool.isTablet);
                if (tabletSize) {
                    startActivity(new Intent(getActivity(), MainActivity.class));
                } else {
                    startActivity(new Intent(getActivity(), SettingsActivity.class));
                }
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    }
}

0

ฉันเพิ่งเสร็จสิ้นการรวบรวมของตัวเองPreferenceScreenโดยใช้ส่วนPreferences APIนี้ดังนั้นฉันจึงคิดว่าฉันจะมีส่วนร่วมในตัวอย่างเต็มของฉันเอง .. ซึ่งรวมถึงการอัปเดตเป็นค่าSummaryใหม่ / ที่เปลี่ยนแปลงตลอดจนการรับฟังและตอบสนองต่อการเปลี่ยนแปลง

ปล. เพื่อตอบคำถามสุดท้ายของคุณ: หากต้องการแสดงค่าเริ่มต้นสำหรับSummaryการสร้างครั้งแรกPreferenceScreen(ก่อนการเปลี่ยนแปลงค่าใด ๆ ) คุณสามารถตั้งค่าandroid:summaryเป็นค่าที่คุณเลือกจากภายในpreferences.xmlไฟล์ได้โดยตรงจากนั้นเมื่อมีการสร้างคือการเปลี่ยนแปลงค่าจะอัปเดตโดยอัตโนมัติโดยใช้รหัสที่มีอยู่ในตัวอย่างด้านล่าง โดยส่วนตัวฉันใช้คำอธิบายสั้น ๆ เป็นคำPreferenceเริ่มต้นของฉันSummaryตั้งภายในของฉันpreferences.xmlแล้วเมื่อราคาไม่ได้รับการเปลี่ยนแปลงเป็นครั้งแรกมันก็จะแสดงค่าปัจจุบันเป็นSummaryจากนั้น ..

ทั้งนี้นี่เป็นของฉันเต็มตัวอย่าง:

SettingsFragment.java

public class SettingsFragment extends PreferenceFragment {

public static final String PREF_NOTIFICATION_MODE = "pref_notificationMode";
private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;

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

    final SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(this.getActivity());

    preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

            if (key.equals(PREF_NOTIFICATION_MODE)) {
                Preference notifModePref = findPreference(key);
                notifModePref.setSummary(sharedPreferences.getString(key, ""));

                //  DO SOMETHING ELSE HERE WHEN (PREF_NOTIFICATION_MODE) IS CHANGED
            }
        }
    };
}

@Override
public void onResume() {
    super.onResume();

    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(preferenceChangeListener);

    Preference notifModePref = findPreference(PREF_NOTIFICATION_MODE);
    notifModePref.setSummary(getPreferenceScreen().getSharedPreferences().getString(PREF_NOTIFICATION_MODE, ""));

}

@Override
public void onPause() {
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);

    super.onPause();
}
}


ฉันหวังว่านี่จะช่วยได้!
ข้อเสนอแนะในเชิงบวกใด ๆ จะได้รับการชื่นชมอย่างมากเนื่องจากฉันค่อนข้างใหม่กับ StackOverflow;) ขอให้
มีความสุขในการเขียนโค้ด!


ในonPause, ควรsuper.onPause()จะเรียกว่าก่อนหรือหลังฟังไม่ลงทะเบียน? แม้จะมีความแตกต่าง? ฉันเคยเห็นทั้งสองอย่างในตัวอย่างมากมาย
Bryan W

@BryanWalsh ฉันยังเห็นตัวอย่างของทั้งสองวิธี .. ฉันคิดว่าการยกเลิกการลงทะเบียนลิสเทอร์เนอร์ก่อนที่จะโทรsuper.onPause();อาจเป็นวิธีที่ดีที่สุดในการดำเนินการนี้
Studio2bDesigns

0

คุณเพียงแค่ลบคลาส Prefernce ที่ระบุในonResume()เมธอดของคุณ ในกรณีของฉันฉันใช้SwitchPreferenceคลาสดังนั้นรหัสจึงเป็นเหมือน - SettingsActivity.class

public static class PrivacyPreferenceFragment extends PreferenceFragment
{
    public SwitchPreference switchPreference;

    @Override
    public void onResume() {
        super.onResume();
        switchPreference = (SwitchPreference) findPreference("privacy_notice_check");
    }

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

    }

จากนั้นในกิจกรรมที่คุณต้องการใช้PrefernceFragmentค่าเพียงแค่ใช้SharedPreferenceวัตถุเพื่อเรียกค่าและทริกเกอร์


0

หากคุณต้องการอัปเดตข้อมูลสรุปโดยใช้ ไลบรารีความชอบ androidx (ดูคำแนะนำอย่างเป็นทางการ ) และการเพิ่มแอตทริบิวต์ต่อไปนี้ใน xml เลย์เอาต์ของคุณก็เพียงพอแล้ว:

<EditTextPreference
    ...
    app:useSimpleSummaryProvider="true" />
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.