Проблема с OnSharedPreferenceChangeListener - PullRequest
0 голосов
/ 17 октября 2018

_

Привет, ребята,

Я создал простое приложение, которое состоит из 1 упражнения и 2 фрагментов (ViewPager).Фрагмент 1 содержит 9 кнопок.

  • 3 кнопки для изменения цвета фона (красный, синий, зеленый)
  • 3 кнопки для установки текстовой строки №.(1, 2 3)
  • 3 кнопки для 3 режимов (A, B, C)

Фрагмент 2 содержит только 1 TextView, который изменяется кнопками фрагмента 1.

Как только нажимается кнопка фрагмента 1, обновляется TextView фрагмента 2.

Пример: я нахожусь в режиме A и нажимаю цвет красный и строку 1, затем япереключитесь в режим B и выберите синий и строку 2. В режиме CI выберите зеленый и строку 3. Теперь при переключении обратно в режим A TextView фрагмента 2 становится красным и 1.

Все работает отлично, но когдапри нажатии на кнопку режима текстовое представление не обновляется.Мне всегда приходится менять вид с обычного на ландшафтный или наоборот.

Когда я просто нажимаю на Nr.или цвет, я вижу изменения немедленно.Кажется, OnPreferenceChangeListener не распознает нажатие кнопки режима, но щелкают другие кнопки.

Что делать?

Фрагмент 1:

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import static android.content.Context.MODE_PRIVATE;

public class Fragment1 extends Fragment
{
    Button buttonModeA, buttonModeB, buttonModeC, buttonRed, buttonBlue, buttonGreen, buttonNr1, buttonNr2, buttonNr3;
    TextView textViewNr;
    String mode, text;
    int bColor; // Background color for textview
    SharedPreferences prefsMode; // Specific SharedPreferences (modes)

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
    {
        View fragmentOne = inflater.inflate(R.layout.fragment1, container, false); // Link view and layout
        buttonModeA = fragmentOne.findViewById(R.id.button_load_a);
        buttonModeB = fragmentOne.findViewById(R.id.button_load_b);
        buttonModeC = fragmentOne.findViewById(R.id.button_load_c);
        buttonRed = fragmentOne.findViewById(R.id.button_red);
        buttonBlue = fragmentOne.findViewById(R.id.button_blue);
        buttonGreen = fragmentOne.findViewById(R.id.button_green);
        buttonNr1 = fragmentOne.findViewById(R.id.button_nr_1);
        buttonNr2 = fragmentOne.findViewById(R.id.button_nr_2);
        buttonNr3 = fragmentOne.findViewById(R.id.button_nr_3);

        loadModeAndSettings(); // Load SharedPreferences
        buttonModeA.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "A"; // Set mode to A
                saveMode(); // Save selected mode
                loadModeAndSettings();
            }
        });
        buttonModeB.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "B"; // Set mode to B
                saveMode(); // Save selected mode
                loadModeAndSettings();
            }
        });
        buttonModeC.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                mode = "C"; // Set mode to C
                saveMode(); // Save selected mode
                loadModeAndSettings();
            }
        });
        buttonRed.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.red); // Set background color to red
                saveSettings(); // Save settings
            }
        });
        buttonBlue.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.blue); // Set background color to blue
                saveSettings(); // Save settings
            }
        });
        buttonGreen.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                bColor = getResources().getColor(R.color.green); // Set background color to green
                saveSettings(); // Save settings
            }
        });
        buttonNr1.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                animationEffect(buttonNr1); // Start animation for this button
                text = "1"; // Set text to 1
                saveSettings(); // Save settings
            }
        });
        buttonNr2.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                text = "2"; // Set text to 2
                saveSettings(); // Save settings
            }
        });
        buttonNr3.setOnClickListener(new View.OnClickListener()
        {
            @Override public void onClick(View v)
            {
                text = "3"; // Set text to 3
                saveSettings(); // Save settings
            }
        });
        return fragmentOne;
    }
    public void saveMode()
    {
        SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Create new SharedPreferences instance
        SharedPreferences.Editor editor = prefs.edit(); // Create access variable for editor
        editor.putString("mode", mode); // Put received value for mode into editor
        editor.apply(); // Save + close instance
    }
    public void saveSettings()
    {
        SharedPreferences prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Create new SharedPreferences instance for selected mode
        SharedPreferences.Editor editorMode = prefsMode.edit(); // Create access variable for editor
        editorMode.putInt("bColor", bColor); // Put received value into editor
        editorMode.putString("text", text); // Put received value into editor
        editorMode.apply(); // Save + close instance
    }
    public void loadModeAndSettings()
    {
        SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Load saved shared file
        mode = prefs.getString("mode", "A"); // mode or default value: A
        prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Retrieve current prefsMode
        bColor = prefsMode.getInt("bColor", 0); // Load value of background color or default value
        text = prefsMode.getString("text", "default"); // Load value of text string or default value
    }
}

Фрагмент 2:

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import static android.content.Context.MODE_PRIVATE;

public class Fragment2 extends Fragment
{
    TextView textViewNr; // Visual feedback for color and nr.
    String mode, text; // Mode for SharedPreferences and text nr. for textViewNr
    int bColor; // Background color for textView
    SharedPreferences prefsMode; // Specific SharedPreferences (modes)
    private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener; // Access variable for SharedPreferencesChangeListener

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
    {
        View fragmentTwo = inflater.inflate(R.layout.fragment2, container, false); // Link view and layout
        textViewNr = fragmentTwo.findViewById(R.id.text_view_nr); // Link variable to ID
        loadModeAndSettings(); // Load SharedPreferences
        preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() // Check if SharedPreferences have been changed
        {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
            {
                loadModeAndSettings(); // Load settings and refresh views if anything has been changed
            }
        };
        prefsMode.registerOnSharedPreferenceChangeListener(preferenceChangeListener); // Apply changes
        return fragmentTwo;
    };
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (preferenceChangeListener != null)
        {
            prefsMode.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
        }
    }
    public void loadModeAndSettings() // Load mode and its settings
    {
        SharedPreferences prefs = getActivity().getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE); // Load saved shared file
        mode = prefs.getString("mode", "A"); // mode or default value: A
        prefsMode = getActivity().getSharedPreferences("MY_SHARED_PREF_"+mode, MODE_PRIVATE); // Retrieve current prefsMode
        bColor = prefsMode.getInt("bColor", 0); // Load value of background color or default value
        text = prefsMode.getString("text", "default"); // Load value of text string or default value
        updateGui(); // Update all views
    }
    public void updateGui() // Refresh views
    {
        textViewNr.setBackgroundColor(bColor); // Update background color of textViewMode
        textViewNr.setText(text); // Update text of textViewMode
    }
}

Спасибо за любую помощь!

С уважением

1 Ответ

0 голосов
/ 22 октября 2018

_ Здравствуйте, эксперты,

Я решил проблему с помощью эксплойта.

Я просто добавил DummyActivity, которое закрывается, как только его вызывают.

Посленажимая кнопку режима в фрагменте 1, я создаю намерение запустить эту DummyActivity - обновляя свой существующий метод saveMode.

(я не чувствую или не вижу ничего из этого процесса RunActivity / Close Activity - по крайней мере, наЭмулятор).

В Fragment2 я переместил 95% кода, который был в onCreateView, в onResume.

Ну, он отлично работает!

PS Может быть, естьБолее чистое решение.

С наилучшими пожеланиями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...