【问题标题】:Get reference to a Spinner in ActionBar在 ActionBar 中获取对 Spinner 的引用
【发布时间】:2014-07-23 08:34:48
【问题描述】:

findViewById() 在您需要查找布局中的任何 UI 元素时可以正常工作。但是,使用此答案How to add a Dropdown item on the action bar 的第二个选项,我在ActionBar 中添加了Spinner

现在我面临的问题是如何检索对此Spinner 的引用,以便我可以更改它使用的字体。 我该怎么做?

我的 menu/sort_spinner 看起来像这样:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/sort" 
        android:showAsAction="always"
        android:title="@string/sort"
        android:actionLayout="@layout/actionbar_spinner"/>
</menu>  

layout/actionbar_spinner 像这样:

<Spinner xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:spinnerMode="dropdown"
    android:id="@+id/spinner"
    android:entries="@array/type" />

【问题讨论】:

    标签: android android-spinner


    【解决方案1】:

    您必须在public boolean onCreateOptionsMenu(Menu menu) 中进行操作。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.sort_spinner, menu);
        MenuItem spinnerItem = menu.findItem(R.id.sort);
        Spinner spinner = (Spinner)spinnerItem.getActionView().findViewById(R.id.spinner);
        //Your rest of code...
        return super.onCreateOptionsMenu(menu);
    }
    

    【讨论】:

    • Typeface?我没有使用自定义适配器:)
    • 您确定findItem(R.id.sort) 吗?你确定不应该是R.id.spinner
    • 您正在将 MenuItem 分配给微调器。
    • @user3249477 是的,我总觉得有些不对劲:)
    • 对不起,我没有完整阅读这个问题并且在代码中犯了一个愚蠢的错误。我没有尝试过,但它应该可以工作。更新了代码。请检查。 :)
    【解决方案2】:

    在您的 onCreateOptionsMenu 中,您可以像这样保存菜单的全局引用:

    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.actionbar_items, menu);
        mMenu = menu;
        ...
    }
    

    编辑:

    但是,要更改字体,您必须使用适配器。这是一个应该工作的例子。

    MenuItem item = mMenu.findItem(R.id.sort);
    Spinner spinner = (Spinner) item.getActionView().findViewById(R.id.spinner);
    
    MyAdapter adapter = new MyAdapter(this, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    
    spinner.setAdapter(adapter);
    
    private class MyAdapter extends ArrayAdapter {
    
        public MyAdapter(Context context, int textViewResourceId) {
            super(context, textViewResourceId);
        }
    
        public TextView getView(int position, View convertView, ViewGroup parent) {
            TextView v = (TextView) super.getView(position, convertView, parent);
            v.setTypeface(myFont);
            return v;
        }
    
        public TextView getDropDownView(int position, View convertView, ViewGroup parent) {
            TextView v = (TextView) super.getView(position, convertView, parent);
            v.setTypeface(myFont);
            return v;
        }
    
    }
    

    【讨论】:

    • 现在是 Typeface 用于微调器内的文本。如何? :)
    • 没有办法避免适配器? :)
    • 恐怕不行。您必须为 TextView 设置字体,除非您制作自定义适配器,否则无法完成。
    • @LittleChild 如果您不打算使用适配器,您需要微调器做什么?那你还怎么填充它?
    • @user3249477 我认为他实际上是在谈论自定义适配器。如果需要,他可以使用ArrayAdapter 简单地填充它。无需定制。但是对于设置TypeFace,他肯定需要自定义它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    相关资源
    最近更新 更多