我有一個PreferenceActivity
,其中有一個ListPreference
有三個選項。在我的MainActivity's
xml文件(activity_main.xml
)中,我將在ListPreference
中選擇的Button
的可見性設置爲VISIBLE
。Android - SharedPreference僅在第二次後更改MainActivity可見性
一切正常,除了一個小問題。只有在第二次在設置屏幕中更改ListPreference
後,它纔會在主屏幕中更改。
爲了更清楚:
- 應用程序啓動和
MainActivity's
activity_main.xml
是顯示出與上次保存的優選項按鈕VISIBLE
和其他兩個GONE
。 - 我點擊F2(我使用模擬器)並點擊設置。設置菜單打開並在下拉菜單中選擇不同的選項。
- 當我回到
activity_main
(使用Esc作爲後面)沒有任何改變。 - 但是,當我再次用F2打開設置菜單並再次更改設置,然後返回到
main_layout
時,按鈕確實會改變(按照我在步驟2中選擇的設置)。
所以,我的問題:如何通過更改的首選項更改可見性後更改我的main_layout
? (如何顯示更改activity_main
馬上當我回去吧。)
我應該在MainActivity
添加@Override onResume()
方法,並調用某種「刷新」呢?
在此先感謝您的回覆。
這裏是我的代碼:
MainActivity.java:
public class MainActivity extends ActionBarActivity
{
...
// Public static MainActivity so we can use findViewById from MyPrefsActivity
public static MainActivity mActivity;
public static final String LIST_PREFERENCE = "prefCheckboxOption";
public static String currentValue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
currentValue = preferences.getString(LIST_PREFERENCE, "0");
setChosenPreference(Integer.valueOf(currentValue));
mActivity = this;
}
public void setChosenPreference(int chosen_value){
// First put all Visibilities on GONE
cbButton.setVisibility(View.GONE);
spinnerButton.setVisibility(View.GONE);
popupButton.setVisibility(View.GONE);
// Then turn the chosen on VISIBLE again
switch(chosen_value){
case 0: // Multi-Click CheckBox
default:
cbButton.setVisibility(View.VISIBLE);
break;
case 1: // Dropdown CheckBox
spinnerButton.setVisibility(View.VISIBLE);
break;
case 2: // Pop-up CheckBox
popupButton.setVisibility(View.VISIBLE);
break;
}
}
...
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch(id){
case R.id.action_settings:
startActivity(new Intent(this, MyPrefsActivity.class));
return true;
}
return false;
}
}
MyPrefsActivity.java:
public class MyPrefsActivity extends PreferenceActivity
{
private static int prefs = R.xml.settings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyPreferenceFragment pf = new MyPreferenceFragment();
getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit();
}
public static class MyPreferenceFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener
{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(MyPrefsActivity.prefs); // outer class
// private members seem to be visible for inner class, and
// making it static made things so much easier
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
preferences.registerOnSharedPreferenceChangeListener(this);
MainActivity.mActivity.setChosenPreference(Integer.valueOf(MainActivity.currentValue));
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if(key.equals(MainActivity.LIST_PREFERENCE)){
ListPreference listPreference = (ListPreference) findPreference(key); // LIST_PREFERENCE
if(listPreference != null){
listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
MainActivity.currentValue = (String) newValue;
MainActivity.mActivity.setChosenPreference(Integer.valueOf(MainActivity.currentValue));
return false;
}
});
}
else
Log.e("MyPrefsActivity", "listPreference is null!");
}
else{
// Other settings
}
}
}
}
activity_main.xml中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.testproject.MainActivity$PlaceholderFragment" >
<ImageButton
android:id="@+id/ibtnCheckbox"
android:visibility="visible"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:contentDescription="@string/checkbox_content_description"
android:src="@drawable/checkbox_unchecked"
android:background="@drawable/transparent_background" />
<ImageButton
android:id="@+id/ibtnSpinner"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:contentDescription="@string/checkbox_content_description"
android:src="@drawable/checkbox_unchecked"
android:background="@drawable/transparent_background" />
<ImageButton
android:id="@+id/ibtnPopup"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:contentDescription="@string/checkbox_content_description"
android:src="@drawable/checkbox_unchecked"
android:background="@drawable/transparent_background" />
</LinearLayout>
的settings.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="@string/checkbox_options_title" >
<ListPreference
android:key="prefCheckboxOption"
android:title="@string/pref_checkbox_option"
android:summary="@string/checkbox_options_summary"
android:entries="@array/checkbox_options"
android:entryValues="@array/checkbox_option_values" />
</PreferenceCategory>
</PreferenceScreen>
arrays.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="checkbox_options">
<item>CheckBox as Multi-Click</item>
<item>CheckBox as Dropdown</item>
<item>CheckBox as Pop-up</item>
</string-array>
<string-array name="checkbox_option_values">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
</resources>
編輯:由於參照其它:
MainActivity.java
是完全一樣的,除了加入onResume()
方法作爲Sir SC發佈。
和MyPrefsActivity。Java已經改變了在更短的版本:
public class MyPrefsActivity extends PreferenceActivity
{
private static int prefs = R.xml.settings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction().replace(android.R.id.content, new MyPreferenceFragment()).commit();
}
public static class MyPreferenceFragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
addPreferencesFromResource(MyPrefsActivity.prefs); // outer class
// private members seem to be visible for inner class, and
// making it static made things so much easier
}
}
}
好吧,這並獲得成功,謝謝。現在我只需要刪除一些重複的代碼,因爲我三次調用setChosenPreference,而在這個onResume方法中只需要它。 –