這個問題是對this未回答的問題的一種後續更多和更好的細節。如何在android中強制從「外部」更新主要活動?
基本上,我有一個android主要活動,顯示從數據庫中取得的一些數據(通過SQLiteDatabase
)。現在我有一個PreferenceActivity
,當用戶想要更改某個首選項時顯示,或者刪除數據庫的內容。在後一種情況下,數據庫的內容將被刪除 - 但我如何使主要活動得到更新?如果我按下按鈕刪除數據庫的內容後查看主要活動,我期望顯示主要活動零點條目!
這裏是主要活動的相關部分:
public class MainActivity extends AppCompatActivity {
SharedPreferences.OnSharedPreferenceChangeListener mPrefListener;
private SharedPreferences settings;
public interface MyCallBack
{
public void refreshMainActivity();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, AlarmService.class);
startService(intent);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mCallback = new MyCallBack() {
@Override
public void refreshMainActivity() {
Toast.makeText(MainActivity.this, "TOAST MAINACTIVITY", Toast.LENGTH_LONG).show();
MainActivity.this.recreate();
}
};
/*
settings = PreferenceManager.getDefaultSharedPreferences(this);
mPrefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Log.d("TEST", "testtest");
Toast.makeText(MainActivity.this, "TOAST MAINACTIVITY", Toast.LENGTH_LONG).show();
finish();
startActivity(getIntent());
}
};
*/
// Register the listener on the SharedPreferences
settings.registerOnSharedPreferenceChangeListener(mPrefListener);
這裏是UserSettingActivity.java
內容:
public class UserSettingActivity extends PreferenceActivity {
private Preference myPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
myPreference = findPreference("reset");
myPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference arg0) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(UserSettingActivity.this);
alertDialog.setMessage("Are you sure to delete the database?");
alertDialog.setCancelable(true);
alertDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
final DBAdapter db = new DBAdapter(UserSettingActivity.this);
db.open();
db.resetDatabase();
callBack = MainActivity.mCallback;
callBack.refreshMainActivity();
} });
alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
} });
alertDialog.show();
return false;
}
});
}
}
最後,描述xml/preferences.xml
的設置佈局的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference android:title="Your Name"
android:key="username"
android:summary="Please provide your username"></EditTextPreference>
<CheckBoxPreference android:title="Application Updates"
android:defaultValue="false"
android:summary="This option if selected will allow the application to check for latest versions."
android:key="applicationUpdates" />
<Preference
android:key="reset"
android:title="Reset database"
android:summary="This will remove every entry in the database"
/>
</PreferenceScreen>
當我點擊按鈕reset
並在設置屏幕上進行確認,並刪除數據庫resetDatabase
執行數據庫中兩個表的DROP
和CREATE TABLE
)。但是,Toast
'TOAST MAINACTIVITY'從未顯示在顯示屏上!
我在這裏錯過了什麼使這項工作,因爲我希望它的工作?我如何在UserSettingActivity
的主要活動中觸發某個方法/函數/某些內容?
TS方法我得到一個錯誤'錯誤:(42 8)錯誤:類myCallBack函數是公共的,應在名爲MyCallBack.java'文件中聲明。我真的需要那樣做嗎?爲三行代碼創建一個單獨的文件? – Alex
不確定你的這個類的公共接口MyCallBack public void refreshMainActivity(); }在oncreate()之外,並且讓你的活動公開並嘗試。 – Arslan
更新你的代碼,以便我可以看到你是如何做到這一點的。 – Arslan