0

我有一个奇怪的问题,已经让我头痛了一周。

我使用某种切换器来更改操作栏中项目的标题并确保正确设置标题。为了保存这个项目的状态,我使用 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>
4

1 回答 1

0

getPreferences()可能很棘手,它假定您只希望您的 SharedPreferences 文件由一个 Activity 使用。(如果您需要详细信息,请查看源代码。)我建议使用getSharedPreferences()一致的文件名。这样,ExtendActivity、RefreshActivity 和 BaseActivity 都将从同一个文件中读取。

于 2013-04-12T22:53:14.323 回答