Spinner背景問題

問題

遇到一個spinner 背景的問題,記錄一下.
我在xml中定義了一個spinner

                android:id="@+id/tracking_mode_spinner"
                android:layout_width="wrap_content"
                android:layout_height="33dp"
                android:spinnerMode="dropdown"
                android:background="@drawable/corner_white_bg_nor"
                android:popupBackground="@drawable/spinner_pop_bg"/>

在java中調(diào)用:

mSpinner = findViewById(R.id.layout_spinner);
mSpinner.setDropDownVerticalOffset(mContext.getResources()
               .getDimensionPixelSize(R.dimen.spinner_offset));
mSpinner.setDropDownWidth(mContext.getResources()
               .getDimensionPixelSize(R.dimen.spinner_width));
mSpinner.setAnimation(null);
       SpinnerAdapter adapter = SpinnerAdapter.createFromResource(mContext,
               CameraFramingMode.createFramingModeEntries(true, false), R.layout.layout_spinner_pop_selectable_item);
       mSpinner.setAdapter(adapter);
       mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
           @Override
           public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
               adapter.setSelectedPosition(position);
               updateView();
           }

           @Override
           public void onNothingSelected(AdapterView<?> parent) {

           }
       });

adapter 是這樣使用:

  SpinnerAdapter adapter = SpinnerAdapter.createFromResource(mContext,
                CameraFramingMode.createFramingModeEntries(true, false), R.layout.layout_spinner_pop_selectable_item);

SpinnerAdapter 定義成這個

    public static class SpinnerAdapter<T> extends ArrayAdapter<T> {

        private int selectedPosition;

        void setSelectedPosition(int selectedPosition) {
            this.selectedPosition = selectedPosition;
        }

        SpinnerAdapter(@NonNull Context context, int resource, @NonNull T[] objects) {
            super(context, resource, R.id.text, objects);
        }

        @Override
        public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            View view = super.getDropDownView(position, convertView, parent);
            TextView icon = view.findViewById(R.id.icon);
            if (selectedPosition == position) {
                FontsUtils.setTypeface(icon);
                icon.setText(FontIcons.OK);
                icon.setVisibility(View.VISIBLE);
            } else {
                icon.setVisibility(View.INVISIBLE);
            }
            return view;
        }

        static @NonNull
        SpinnerAdapter<CharSequence> createFromResource(@NonNull Context context,
                                                        CharSequence[] items, @LayoutRes int textViewResId) {
            return new SpinnerAdapter<>(context, textViewResId, items);
        }
    }

layout_spinner_pop_selectable_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_spinner_item_bg"
    android:gravity="center_vertical"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/text"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:background="@android:color/transparent"
   />
    <TextView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
   />
</LinearLayout>

但是我發(fā)現(xiàn)spinner 設(shè)置的bg會被item的bg覆蓋selector_spinner_item_bg.
抓取控件樹發(fā)現(xiàn),spinner的顯示會把下拉框一個item作為顯示的內(nèi)容.


image.png

這樣子會有問題,當(dāng)item的布局樣式和spinner不一樣時,spinner的樣式會被覆蓋.
舉個例子:當(dāng)item背景要紅色,spinner背景要黑色時,spinner設(shè)置了黑色背景無用.

原因

spinner源碼中:makeView 獲取view是通過Adapter#getView的方式獲取的

/**
     * Obtain a view, either by pulling an existing view from the recycler or
     * by getting a new one from the adapter. If we are animating, make sure
     * there is enough information in the view's layout parameters to animate
     * from the old to new positions.
     *
     * @param position Position in the spinner for the view to obtain
     * @param addChild true to add the child to the spinner, false to obtain and configure only.
     * @return A view for the given position
     */
    private View makeView(int position, boolean addChild) {
        View child;

        if (!mDataChanged) {
            child = mRecycler.get(position);
            if (child != null) {
                // Position the view
                setUpChild(child, addChild);

                return child;
            }
        }

        // Nothing found in the recycler -- ask the adapter for a view
        child = mAdapter.getView(position, null, this);

        // Position the view
        setUpChild(child, addChild);

        return child;
    }

DropDownAdapter#getView,這個方法不是抽象,所以當(dāng)我們沒有重寫此方法時,他返回的就是item的view.

 public View getView(int position, View convertView, ViewGroup parent) {
            return getDropDownView(position, convertView, parent);
        }

修改

知道原因了就好修改了,我們重寫getView重新設(shè)置一個view即可.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹃操,一起剝皮案震驚了整個濱河市助隧,隨后出現(xiàn)的幾起案子骑素,更是在濱河造成了極大的恐慌,老刑警劉巖唐责,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侧啼,死亡現(xiàn)場離奇詭異,居然都是意外死亡务豺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門嗦明,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笼沥,“玉大人,你說我怎么就攤上這事娶牌”记常” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵诗良,是天一觀的道長汹桦。 經(jīng)常有香客問我,道長鉴裹,這世上最難降的妖魔是什么营勤? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任灵嫌,我火速辦了婚禮,結(jié)果婚禮上葛作,老公的妹妹穿的比我還像新娘。我一直安慰自己猖凛,他們只是感情好赂蠢,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辨泳,像睡著了一般虱岂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菠红,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天第岖,我揣著相機與錄音,去河邊找鬼试溯。 笑死蔑滓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遇绞。 我是一名探鬼主播键袱,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摹闽!你這毒婦竟也來了蹄咖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤付鹿,失蹤者是張志新(化名)和其女友劉穎澜汤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舵匾,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡俊抵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纽匙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片务蝠。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖烛缔,靈堂內(nèi)的尸體忽然破棺而出馏段,到底是詐尸還是另有隱情,我是刑警寧澤践瓷,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布院喜,位于F島的核電站,受9級特大地震影響晕翠,放射性物質(zhì)發(fā)生泄漏喷舀。R本人自食惡果不足惜砍濒,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硫麻。 院中可真熱鬧爸邢,春花似錦、人聲如沸拿愧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浇辜。三九已至券敌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柳洋,已是汗流浹背待诅。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熊镣,地道東北人卑雁。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像轧钓,于是被迫代替她去往敵國和親序厉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容