0

私は奇妙な問題を抱えており、すでに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>
4

1 に答える 1

0

getPreferences()注意が必要な場合があります。SharedPreferences ファイルを 1 つのアクティビティでのみ使用することを前提としています。(詳細が必要な場合は、ソース コードgetSharedPreferences()を参照してください。)代わりに、一貫したファイル名を使用することをお勧めします。このようにして、ExtendActivity、RefreshActivity、および BaseActivity はすべて同じファイルから読み取ります。

于 2013-04-12T22:53:14.323 に答える