2015-12-07 46 views
0

這個問題是對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執行數據庫中兩個表的DROPCREATE TABLE)。但是,Toast'TOAST MAINACTIVITY'從未顯示在顯示屏上!

我在這裏錯過了什麼使這項工作,因爲我希望它的工作?我如何在UserSettingActivity的主要活動中觸發某個方法/函數/某些內容?

回答

3

的解決方案可能是一個有點棘手使用回調,但我希望這會根據你的情況爲你工作..

首先在MainActivity.java創建界面這樣

public interface MyCallBack 
{ 
public void refreshMainActivity(); 
} 

然後實現這個接口在您的主要活動是這樣

public class MainActivity extends AppCompatActivity { 
public static MyCallBack mCallback; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

mCallback = new MyCallBack() { 
    @Override 
    public void refreshMainActivity() { 
      MainActivity.this.recreate(); 

       "OR" 

       finish(); 
       startActivity(getIntent()); 
     } 
    }; 
} 

現在,在您userSettingActivity.java使用此接口這樣並調用我當你想更新MainActivity.java

public class UserSettingActivity extends AppCompatActivity{ 
MainActivity.MyCallBack callBack; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.settingsactivity); 
    callBack = MainActivity.mCallback; 

    //this is sample code ..call this function when you want to update mainactivity 
    callBack.refreshMainActivity(); 
} 

} 
+0

TS方法我得到一個錯誤'錯誤:(42 8)錯誤:類myCallBack函數是公共的,應在名爲MyCallBack.java'文件中聲明。我真的需要那樣做嗎?爲三行代碼創建一個單獨的文件? – Alex

+0

不確定你的這個類的公共接口MyCallBack public void refreshMainActivity(); }在oncreate()之外,並且讓你的活動公開並嘗試。 – Arslan

+0

更新你的代碼,以便我可以看到你是如何做到這一點的。 – Arslan

相關問題