0

我有一個PreferenceActivity,其中有一個ListPreference有三個選項。在我的MainActivity's xml文件(activity_main.xml)中,我將在ListPreference中選擇的Button的可見性設置爲VISIBLEAndroid - SharedPreference僅在第二次後更改MainActivity可見性

一切正常,除了一個小問題。只有在第二次在設置屏幕中更改ListPreference後,它纔會在主屏幕中更改。

爲了更清楚:

  1. 應用程序啓動和MainActivity'sactivity_main.xml是顯示出與上次保存的優選項按鈕VISIBLE和其他兩個GONE
  2. 我點擊F2(我使用模擬器)並點擊設置。設置菜單打開並在下拉菜單中選擇不同的選項。
  3. 當我回到activity_main(使用Esc作爲後面)沒有任何改變。
  4. 但是,當我再次用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 
     } 
    } 
} 

回答

2

創建MainActivity內的onResume()功能。

在您的onResume()函數內設置更改,因此當您從其他Activity按回時,您的MainActivity的onResume將被調用,並且您在其中寫入的設置將被顯示。

當我從你的榜樣理解應該是這樣的:

@Override 
protected void onResume() { 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    currentValue = preferences.getString(LIST_PREFERENCE, "0"); 
    setChosenPreference(Integer.valueOf(currentValue)); 
    super.onResume(); 
} 
+0

好吧,這並獲得成功,謝謝。現在我只需要刪除一些重複的代碼,因爲我三次調用setChosenPreference,而在這個onResume方法中只需要它。 –

相關問題