如何在 android 中从 'outside' 强制更新主 activity?
How to force an update of the main activity from 'outside' in android?
此问题是 this 未回答问题的后续问题,包含更多更好的细节。
基本上,我有一个 android 主 activity 显示一些从数据库中获取的数据(通过 SQLiteDatabase
)。现在我有一个 PreferenceActivity
,当用户想要更改某些偏好或删除数据库的内容时会显示它。在后一种情况下,数据库的内容被删除了——但是我该如何更新主 activity 呢?如果我在按下删除数据库内容的按钮后查看 main activity,我希望显示 main activity 零条目!
这里是正文的相关部分activity:
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 文件描述了 xml/preferences.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
?
中触发主 activity 中的 method/function/something
使用回调的解决方案可能有点棘手,但我希望根据您的情况这对您有用..
首先在你的MainActivity.java中创建界面,像这样
public interface MyCallBack
{
public void refreshMainActivity();
}
然后像这样在你的主 activity 中实现这个接口
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();
}
}
此问题是 this 未回答问题的后续问题,包含更多更好的细节。
基本上,我有一个 android 主 activity 显示一些从数据库中获取的数据(通过 SQLiteDatabase
)。现在我有一个 PreferenceActivity
,当用户想要更改某些偏好或删除数据库的内容时会显示它。在后一种情况下,数据库的内容被删除了——但是我该如何更新主 activity 呢?如果我在按下删除数据库内容的按钮后查看 main activity,我希望显示 main activity 零条目!
这里是正文的相关部分activity:
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 文件描述了 xml/preferences.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
?
使用回调的解决方案可能有点棘手,但我希望根据您的情况这对您有用..
首先在你的MainActivity.java中创建界面,像这样
public interface MyCallBack
{
public void refreshMainActivity();
}
然后像这样在你的主 activity 中实现这个接口
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();
}
}