2015-02-11 54 views
1

我有一個TextView和一個設置活動(從Android的Studio模板生成)的主要活動類。Android:如何從偏好活動類中調用主類的方法?

在設置活動上,我宣佈了很多設置。主要活動的TextView顯示了其中一個設置,這是通過加載所有首選項的當前狀態並將其保存在變量上的函數完成的。

如果我更改了設置活動的某些內容,監聽器將執行,但該值不會在主活動中更新。

我不能使用onResume()方法,因爲它在第一次啓動應用程序時也會執行。

我試過發送一個Intent並從監聽器中啓動主類,但是這會創建一個新的主類實例,並且只允許您更改一個首選項,因爲監聽器會觸發。

我的主要活動是這樣的:

public class MainActivity extends ActionBarActivity { 

private SharedPreferences prefs; 

private double _lat; 


public void loadPrefs(){ 

    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    _lat = Double.parseDouble(prefs.getString("lat", "")); 

    //updates the iu 
    TextView helloThere = (TextView) findViewById(R.id.TextView_hello_world); 
    helloThere.setText(Double.toString(_lat)); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    String changes = getIntent().getStringExtra("prefChanged"); 
    if(changes != null) 
     Log.d("DEBUG!!!!", changes); 
    else 
     Log.d("DEBUG!!!!", "No changes!!!!"); 
} 



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

    loadPrefs(); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if (id == R.id.action_settings) { 
     // Launch Settings activity 
     Intent intent = new Intent(this, SettingsActivity.class); 
     startActivity(intent); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

這是設置活動(看叫onSharedPreferenceChanged功能):

public class SettingsActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener { 
SharedPreferences.OnSharedPreferenceChangeListener listener; 
/** 
* Determines whether to always show the simplified settings UI, where 
* settings are presented in a single list. When false, settings are shown 
* as a master/detail two-pane view on tablets. When true, a single pane is 
* shown on tablets. 
*/ 
private static final boolean ALWAYS_SIMPLE_PREFS = false; 
private SharedPreferences prefs; 

@Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
    Log.d("DEBUG!!","LISTENER!!"); 
    Intent i = new Intent(this, MainActivity.class); 
    i.putExtra("prefChanged","Something changed..."); 
    startActivity(i); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    prefs.registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    prefs.unregisterOnSharedPreferenceChangeListener(this); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 

    setupSimplePreferencesScreen(); 
} 

/** 
* Shows the simplified settings UI if the device configuration if the 
* device configuration dictates that a simplified, single-pane UI should be 
* shown. 
*/ 
private void setupSimplePreferencesScreen() { 
    if (!isSimplePreferences(this)) { 
     return; 
    } 

    // In the simplified UI, fragments are not used at all and we instead 
    // use the older PreferenceActivity APIs. 

    // Add 'general' preferences. 
    addPreferencesFromResource(R.xml.pref_general); 

    // Add 'notifications' preferences, and a corresponding header. 
    PreferenceCategory fakeHeader = new PreferenceCategory(this); 
    fakeHeader.setTitle(R.string.pref_header_notifications); 
    getPreferenceScreen().addPreference(fakeHeader); 
    addPreferencesFromResource(R.xml.pref_notification); 

    // Add 'data and sync' preferences, and a corresponding header. 
    //fakeHeader = new PreferenceCategory(this); 
    //fakeHeader.setTitle(R.string.pref_header_data_sync); 
    //getPreferenceScreen().addPreference(fakeHeader); 
    //addPreferencesFromResource(R.xml.pref_data_sync); 

    // Bind the summaries of EditText/List/Dialog/Ringtone preferences to 
    // their values. When their values change, their summaries are updated 
    // to reflect the new value, per the Android Design guidelines. 
    //bindPreferenceSummaryToValue(findPreference("example_text")); 
    //bindPreferenceSummaryToValue(findPreference("example_list")); 
    bindPreferenceSummaryToValue(findPreference("notifications_ringtone")); 
    //bindPreferenceSummaryToValue(findPreference("sync_frequency")); 
} 

/** 
* {@inheritDoc} 
*/ 
@Override 
public boolean onIsMultiPane() { 
    return isXLargeTablet(this) && !isSimplePreferences(this); 
} 

/** 
* Helper method to determine if the device has an extra-large screen. For 
* example, 10" tablets are extra-large. 
*/ 
private static boolean isXLargeTablet(Context context) { 
    return (context.getResources().getConfiguration().screenLayout 
      & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; 
} 

/** 
* Determines whether the simplified settings UI should be shown. This is 
* true if this is forced via {@link #ALWAYS_SIMPLE_PREFS}, or the device 
* doesn't have newer APIs like {@link PreferenceFragment}, or the device 
* doesn't have an extra-large screen. In these cases, a single-pane 
* "simplified" settings UI should be shown. 
*/ 
private static boolean isSimplePreferences(Context context) { 
    return ALWAYS_SIMPLE_PREFS 
      || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB 
      || !isXLargeTablet(context); 
} 

/** 
* {@inheritDoc} 
*/ 
@Override 
@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public void onBuildHeaders(List<Header> target) { 
    if (!isSimplePreferences(this)) { 
     loadHeadersFromResource(R.xml.pref_headers, target); 
    } 
} 

/** 
* A preference value change listener that updates the preference's summary 
* to reflect its new value. 
*/ 
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object value) { 
     String stringValue = value.toString(); 

     if (preference instanceof ListPreference) { 
      // For list preferences, look up the correct display value in 
      // the preference's 'entries' list. 
      ListPreference listPreference = (ListPreference) preference; 
      int index = listPreference.findIndexOfValue(stringValue); 

      // Set the summary to reflect the new value. 
      preference.setSummary(
        index >= 0 
          ? listPreference.getEntries()[index] 
          : null); 

     } else if (preference instanceof RingtonePreference) { 
      // For ringtone preferences, look up the correct display value 
      // using RingtoneManager. 
      if (TextUtils.isEmpty(stringValue)) { 
       // Empty values correspond to 'silent' (no ringtone). 
       preference.setSummary(R.string.pref_ringtone_silent); 

      } else { 
       Ringtone ringtone = RingtoneManager.getRingtone(
         preference.getContext(), Uri.parse(stringValue)); 

       if (ringtone == null) { 
        // Clear the summary if there was a lookup error. 
        preference.setSummary(null); 
       } else { 
        // Set the summary to reflect the new ringtone display 
        // name. 
        String name = ringtone.getTitle(preference.getContext()); 
        preference.setSummary(name); 
       } 
      } 

     } else { 
      // For all other preferences, set the summary to the value's 
      // simple string representation. 
      preference.setSummary(stringValue); 
     } 
     return true; 
    } 
}; 

/** 
* Binds a preference's summary to its value. More specifically, when the 
* preference's value is changed, its summary (line of text below the 
* preference title) is updated to reflect the value. The summary is also 
* immediately updated upon calling this method. The exact display format is 
* dependent on the type of preference. 
* 
* @see #sBindPreferenceSummaryToValueListener 
*/ 
private static void bindPreferenceSummaryToValue(Preference preference) { 
    // Set the listener to watch for value changes. 
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); 

    // Trigger the listener immediately with the preference's 
    // current value. 
    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, 
      PreferenceManager 
        .getDefaultSharedPreferences(preference.getContext()) 
        .getString(preference.getKey(), "")); 
} 


/** 
* This fragment shows general preferences only. It is used when the 
* activity is showing a two-pane settings UI. 
*/ 
@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public static class GeneralPreferenceFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.pref_general); 

     // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
     // to their values. When their values change, their summaries are 
     // updated to reflect the new value, per the Android Design 
     // guidelines. 
     //bindPreferenceSummaryToValue(findPreference("fixed_lat_long")); 
     bindPreferenceSummaryToValue(findPreference("example_text")); 
     bindPreferenceSummaryToValue(findPreference("example_list")); 
    } 
} 

/** 
* This fragment shows notification preferences only. It is used when the 
* activity is showing a two-pane settings UI. 
*/ 
@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public static class NotificationPreferenceFragment extends PreferenceFragment { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.pref_notification); 

     // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
     // to their values. When their values change, their summaries are 
     // updated to reflect the new value, per the Android Design 
     // guidelines. 
      bindPreferenceSummaryToValue(findPreference("notifications_ringtone")); 
    } 
} 

}

獎金問題:我使用Android的Studio生成了設置活動模板,我注意到沒有onCreate()方法,這是正常的嗎?當我從主要活動中調用startactivity()函數時會執行什麼操作?

謝謝。

PS:也許我已經發布了太多的代碼來解決這個問題,對不起,我剛剛開始使用Android,感覺像一個noob。

+0

你應該在這種情況下使用onActivityResult。 – 2015-02-11 09:07:26

回答

1

您不應該嘗試從SettingsActivity更改MainActivity的UI! MainActivity的用戶界面管理只能由其自己完成。

看看Activity Lifecycle。當活動返回到前臺時,您會看到MainActivityonResume()方法將被調用。因此有兩種解決方案:

  1. 您在onResume()中致電loadPrefs()。你告訴你不能這樣做,但我不明白爲什麼(也許我錯過了一些細節)
  2. onResume()方法中,只有在檢測到更改時才調用loadPrefs()

再次:不要嘗試從另一個類中調用MainActivity的方法:這是Android世界中的一種無意義。

獎金anwser

onCreate()方法在Activity類中聲明,因此有一個默認的行爲。如果您想修改默認行爲(即聲明您自己的UI組件),則可以覆蓋它(添加@Override註釋時這樣做)。所以默認情況下,絕對不需要重寫它。如果不覆蓋默認實現將被調用。這是一個面向對象的基礎;)

+0

我顯然需要休息。你的回答幫助了我。我不知道當我嘗試從onResume()調用loadPrefs()但沒有工作時我做了什麼。我想我太專注於從一個班級發送信息到另一個班級。現在它工作,謝謝。對於獎金問題抱歉,我知道,但是3小時前我沒有看清楚。謝謝。 – cuentafalsa7 2015-02-11 13:06:17

0
  1. 無需從設置活動
  2. 從主要活動的onResume()呼叫loadPrefs()而不是從onCreate()
  3. 沒有在設置的活動onCreate()方法啓動的主要活動。
+0

是的,沒錯!我只是陷入了我自己的想法。對不起,我還無法登錄。謝謝。 – cuentafalsa7 2015-02-11 13:10:32

相關問題