我有一个奇怪的问题,已经让我头痛了一周。
我使用某种切换器来更改操作栏中项目的标题并确保正确设置标题。为了保存这个项目的状态,我使用 sharedpreferences。
在应用程序的其他部分,我使用 asynctask。问题是在 asynctask 运行时,BaseActivity 读取了错误的操作栏设置值,因此在 asynctask 完成之前它的标题不正确。
我为你准备了这个错误的例子。奇怪的是,如果我在 onPostExecute 方法中将活动从 ExtendActivity 更改为 RefreshActivity,令人惊讶的是它确实读取并设置了正确的标题。当然,我不能在实际应用中做到这一点。
基本活动:
public class BaseActivity extends Activity {
public boolean menub;
public Menu menu;
public SharedPreferences pref;
@Override
public void onCreate(Bundle savedInstanceState) {
this.pref = this.getPreferences(Context.MODE_PRIVATE);
super.onCreate(savedInstanceState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
this.menu = menu;
this.menub = pref.getBoolean("menub", true);
_switch(false);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_refresh:
startActivity(new Intent(this, RefreshActivity.class));
return true;
case R.id.menu_test:
_switch(true);
default:
return false;
}
}
public void _switch(boolean swtch) {
String n;
if (swtch) {
SharedPreferences.Editor e = pref.edit();
if (menub) {
e.putBoolean("menub",false);
n="A";
}
else {
e.putBoolean("menub", true);
n="B";
}
e.apply();
}
else {
if (menub) n="B";
else n="A";
}
menu.findItem(R.id.menu_test).setTitle(n);
}
}
刷新活动:
public class RefreshActivity extends BaseActivity {
protected ImageLoader imageLoader = ImageLoader.getInstance();
public Activity thisActivity;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
thisActivity=this;
Bundle b = getIntent().getExtras();
if (b==null) {
load();
}
else {
if (b.containsKey("loaded")) {
new _async().execute();
}
}
}
private class _async extends AsyncTask<Object, Void, Integer> {
@Override
protected Integer doInBackground(Object... params) {
try {Thread.sleep(2000);} catch (InterruptedException e) {}
return 1;
}
@Override
protected void onPostExecute(Integer response) {
Intent intent = new Intent(thisActivity,ExtendActivity.class);
intent.putExtra("id_folder", 0);
startActivity(intent);
thisActivity.finish();
}
}
public void load() {
Intent intent = new Intent(this,RefreshActivity.class);
intent.putExtra("loaded",true);
startActivity(intent);
((Activity) this).finish();
}
}
扩展活动:
public class ExtendActivity extends RefreshActivity {
}
菜单.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_refresh"
android:title="Refresh"
android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_test"
android:title="A"
android:showAsAction="ifRoom|withText" />
</menu>