以编程方式关闭ActionBar Spinner或避免打开它

时间:2013-07-10 18:01:50

标签: android actionbarsherlock android-actionbar android-spinner

我正在尝试使用ActionBar中的微调器在我的应用中提供帐户上下文。列表中的最后一个位置还有一个“添加帐户”元素。我正在使用ABS并使用.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

配置微调器外观

到目前为止一切顺利。

用户首次启动应用时,此spinner将为空,唯一的选择是“添加帐户”,这也是在微调器当前选择中可见的文本。我想要实现的是当用户点击spinner时(不在打开的列表中,而是在微调器本身上),将用户重定向到新的帐户活动。在我的适配器中,我可以检测到它并打开屏幕:

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        ...
    }

    if (parent.getClass() == Spinner.class && ((Spinner) parent).getCount() == 1) { //"Hack" for initial click on "Add Account" in the spinner when it's empty
        Intent intent = new Intent(context, AccountPreferenceActivity.class);
        ((HomeActivity) context).startActivityForResult(intent, HomeActivity.ACTIVITY_PREFERENCE_ACCOUNT);
    }

    ...

    return convertView;
}

我的问题是,在填写新表单并返回主屏幕后,微调器将打开,这是一种丑陋的用户体验。

我的第一次尝试是避免在getDropDownView方法中打开微调器,但是我没能实现它。然后我尝试了各种肮脏的解决方法(make spinner消失/重新出现,专注于屏幕中的另一个字段,模拟后退按钮......),但似乎没有任何效果。

你知道如何实现这个目标吗?

由于

3 个答案:

答案 0 :(得分:1)

使用 SherlockAction

setSlidingActionBarEnabled(true);

停止使用微调器: -

setSupportProgressBarIndeterminateVisibility(false);

要重新启动Spinner使用: -

setSupportProgressBarIndeterminateVisibility(true);

答案 1 :(得分:1)

为什么你不使用actionbar.setNavigationCallBacks功能?! 这是我正在使用的一个例子,也许它会有所帮助:

Context context = getSupportActionBar().getThemedContext();
ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(context, R.array.navigations,
        R.layout.sherlock_spinner_item);
list.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);

mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

mActionBar.setListNavigationCallbacks(list, new OnNavigationListener() {

    @Override
    public boolean onNavigationItemSelected(int itemPosition, long itemId) {

    if (itemPosition == 0) {


    } else if (itemPosition == 1) {
        Intent intent = new Intent(MainActivity.this, SomeActivity.class);
        startActivity(intent);

    }

    return true;
    }
});

然后在 string.xml 中定义要在导航列表中显示的元素数组

<string-array name="navigations">
        <item>create account</item>
    </string-array>

<强>编辑:

好的,我找到了你的答案,为实现这一点,你必须在new View()

后返回getDropDownView(...)
    @Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {

if (! someSharedPreferencedObject.getBoolean("isAlreadyCreated", false)) {
    if (parent.getClass() == Spinner.class && ((Spinner) parent).getCount() == 1) {

    Intent intent = new Intent(mContext, UserSettingActivity.class);
    mContext.startActivity(intent);
    return new View(mContext);
    }
} else {
    return super.getDropDownView(position, convertView, parent);
}
}

答案 2 :(得分:1)

您是否尝试使微调器的适配器无效/重置它?它可能会产生预期的效果。

否则,如果我理解了您要正确实现的目标,您可以先在文本“操作按钮”中轻松添加选项菜单项,然后再进入添加帐户屏幕。

在您回来并且有一个活动帐户后,您可以使用适配器填充微调器/使选项菜单无效。