私は奇妙な問題を抱えており、すでに1週間頭痛がしています。
アクションバーのアイテムのタイトルを変更し、タイトルが正しく設定されていることを確認する一種のスイッチャーを使用しています。このアイテムの状態を保存するには、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 {
}
menu.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>