Android Actionbar会破坏应用程序

时间:2013-07-15 04:14:07

标签: android android-actionbar

我花了最后几个小时搞清楚为什么我的应用程序崩溃而没有加载错误消息。

基本上,当我通过USB或模拟器运行时,屏幕每隔半秒左右刷新一次。查看日志,它似乎在循环中运行onCreate。我无法弄清楚为什么!最终,有一堆“频道不可挽回地被打破并将被处置”的消息。这条消息也出现了很多:

07-15 13:59:22.334:ERROR / AbstractCompatWrapper(381):对AbstructCompatWrapper的输入无效 07-15 13:59:22.334:ERROR / CompatUtils(381):调用异常:NullPointerException

如果你愿意,我可以发一个完整的日志,但我找不到任何有用的东西。

最后,我发现删除对'fillActionBar'的调用,这是一个实例化操作栏的方法,“修复”了问题。但是,我希望能够使用动作栏!我做错了什么?

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    resultBox = (TextView) findViewById(R.id.readout_values);

    // commenting out the following line fixes the problem, 
    // but removes the action bar.
    this.actionBar = fillActionBar(); 

    try {
        specialHttpClient = new SpecialHttpClient(
                "username", "password");
    } catch (Exception e) {
        Dbg.loge(this.getClass().getName(), "Could not instantiate client", e);
    }
}

private ActionBar fillActionBar() {
    ActionBar bar = getActionBar();// getSupportActionBar();
    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(
            this,
            android.R.layout.simple_spinner_dropdown_item,
            //R.layout.sherlock_spinner_item,
            pages
    );
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    ActionBar.OnNavigationListener navListener = new ActionBar.OnNavigationListener() {
        @Override
        public boolean onNavigationItemSelected(int itemPosition, long itemId) {
            Intent i = null;
            switch(itemPosition) {
                case 0:
                    i = new Intent(context, RecorderActivity.class);
                    break;
                case 1:
                    i = new Intent(context, TrackerActivity.class);
                    break;
            }
            startActivity(i);
            return true;
        }
    };
    bar.setListNavigationCallbacks(spinnerAdapter, navListener);
    return bar;
}

** 编辑 **

问题似乎是即使没有按下按钮也会调用startActivity(i)。将该调用移至第二个菜单项似乎只能解决问题 - 但为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

有时会发生压缩问题以便在SO上发布的过程有助于揭示答案。

问题在于,由于一个我不理解的原因,ActionBar菜单中的第一个项目在创建时被调用 - 因此Activity不断调用startActivity()。

将switch语句调整为以下语句可以阻止错误:

    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {
            switch(itemPosition) {
                case 0:
                    break;
                case 1:
                    Intent i = new Intent(context, TrackerActivity.class);
                    startActivity(i);
                    break;
            }
            return true;
    }

我会给任何可以解释原因的人提供正确答案!