_
Привет, ребята,
Я создал простое приложение, которое состоит из 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
}
}
Спасибо за любую помощь!
С уважением