findPreference () возвращает ноль - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь изменить тумблер SwitchPreferenceCompat на true и false прагматически. Однако в классе SettingsFragment метод ammendSwitchPreferenceSetting () переменная предпочтения всегда равна нулю, однако, если я вызову этот метод из onCreatePreferences (), он будет работать, но мне нужно вызывать его в другом месте.


import android.os.Bundle;

import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.CheckBoxPreference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreferenceCompat;

public class SettingsActivity extends AppCompatActivity {

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

        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings, new SettingsFragment())
                .commit();
        ActionBar actionBar = getSupportActionBar();

        //will allow the user to go back to parent page of the application
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    public static class SettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
        }

        public void ammendSwitchPreferenceSetting(String key, boolean value){
            //is always null for some reason
            SwitchPreferenceCompat preference =  findPreference(key);
            preference.setChecked(value);
        }

    }
}
 <SwitchPreferenceCompat
            android:enabled="true"
            android:summary="some summary"
            app:defaultValue="true"
            app:key="NetworkType"
            app:title="some title" />

А потом я звоню из другого класса

SettingsActivity.SettingsFragment settingsFragment = new SettingsActivity.SettingsFragment();
settingsFragment.ammendSwitchPreferenceSetting("NetworkType", false);

1 Ответ

0 голосов
/ 17 октября 2019

Я использую Kotlin, и вот как я могу изменить значения переключателя.

val sharedpref = PreferenceManager.getDefaultSharedPreferences(this).edit()
sharedpref.putBoolean("NetworkType",false).apply()

В Java это будет выглядеть так

sharedpref prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
sharedpref.Editor editor = prefs.edit();
editor.putBoolean("NetworkType",false);
editor.apply();

ПримечаниеЯ не тестировал эту версию Java, но концепция такая.

...