0

我在 Nexus 7 平板电脑上运行我的应用程序时遇到问题,而它可以在其他设备上运行,甚至是 Nexus 4。

我试图放置一个由 JSON 响应中的元素填充的微调器(我通过 Asynctask 从服务器获取此响应),除了在 Nexus 7 上之外,它都运行良好,因为应用程序在启动时中断(可能在微调器上设置适配器时),不幸的是我无法在 Nexus 7 上调试应用程序,因为我无权访问管理员帐户。在 Nexus 4 上调试相同的问题时,我发现 findById() 方法没有找到我在操作栏中的微调器,尽管相同的代码在 Galaxy S2 上工作,并且在将菜单项更改为此之后:

<item
    android:id="@+id/menuCategory"
    android:actionLayout="@layout/action_categories"
    android:actionViewClass="android.widget.Spinner"
    android:showAsAction="always"
    android:title="@string/collection"/>

<?xml version="1.0" encoding="utf-8"?>
<Spinner xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menuCategorySpinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

它开始在 Nexus 4 上工作,但在 Nexus 7 上仍然中断。我认为代码的相关部分是:

//First do this to initialise elements of the menu
invalidateOptionsMenu();
//Find the spinner by id
spinner = (Spinner) findViewById(R.id.menuCategorySpinner);
//Initilise adapter
final ArrayAdapter<Category> Adapter = new ArrayAdapter<Category>(this, android.R.layout.simple_dropdown_item_1line, result);
//Set adapter
spinner.setAdapter(Adapter);

我认为问题出在最后一行,因为如果之前没有通过 id 找到微调器,则微调器可能为空,但我不知道为什么仅在 Nexus 7 上没有找到它,有人知道会发生什么吗?

4

1 回答 1

0

我想我找到了一个解决方案,但我仍然讨厌这样的事实,即在不同的 android 版本的设备上存在这样的差异(Galaxy S2 使用 4.1.2,Nexus 设备是 4.2.2)。我什至考虑将此报告为 android 平台上的错误,但必须检查它是否作为错误报告有效。总而言之,这里是那些需要它的人的答案:在您的 onCreateOptionsMenu 中添加:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.full, menu);
            //getActionView() get a view for the given action
    spinner = (Spinner) menu.findItem(R.id.menuCategory).getActionView();
    return super.onCreateOptionsMenu(menu);
}

getActionView() 是非常合乎逻辑的重要部分,但我不明白为什么在其他平台上 spinner = (Spinner) menu.findItem(R.id.menuCategory); 有效,所以如果有人遇到这个问题并且可以解释那部分,请写评论

于 2013-06-27T12:02:43.007 回答