2016-04-07 2 views
8

私はデザインに取り組んでMはスピナーは私が何をしたいカスタム がダウンして、私は違うとiがポップアップの背景に異なるアンドロイドのスピナーの上または下にドロップダウンメニューが表示されているかどうかを検出する方法は?

を使用したいスピナー上で、それのポップアップ popupbackgroundの画像を使用したいスピナー以下のときスピナーポップアップドロップで見えましたここに私のXMLコードは次のとおりです。

<Spinner 
    android:id="@+id/spinner1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:spinnerMode="dropdown" 
    android:popupBackground="@drawable/spinnerbottombg" 
    android:overlapAnchor="false" 
    android:drawSelectorOnTop="false" 

    /> 

今の質問はどのように私はスピナーがそれの上または下

+0

あなたはスピナーでカスタムスタイルを適用する方法を求めていますか?スピナーの上または下にドロップダウンメニューが表示されているかどうかを確認する方法は?あなたのタイトルが混乱しているため明確になる – Anonymous

+1

ドロップダウンメニューがスピナーの上または下に表示されているかどうかを検出する方法は? – Nawaf

+0

あなたのxmlファイルにアンドロイド:spinnerMode = "dialog"を使用してください –

答えて

10

をドロップダウンリストを開き、知っている私はPopupWindowに深く掘ると、あなたの要件をすることによって実現できることが分かっています

StateListDrawable

以下のコードはeverything-

activity_main.xmlを説明します

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.mmbarno.dummyalertdialog.MainActivity"> 

    <Spinner 
     android:id="@+id/spinner" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:spinnerMode="dropdown" 
     android:overlapAnchor="false" 
     android:drawSelectorOnTop="false" /> 
</RelativeLayout> 

popup_bg_above.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="#FF4081" /> 
</shape> 

popup_bg_below.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shape="rectangle"> 
    <solid android:color="#3F51B5" /> 
</shape> 

MainActivity.javaで最後に

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Spinner spinner = (Spinner) findViewById(R.id.spinner); 
    spinner.setPopupBackgroundDrawable(getPopupBg()); 
    populateSpinner(); 
} 

private void populateSpinner() { 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
      R.array.planets_array, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner.setAdapter(adapter); 
} 

private StateListDrawable getPopupBg() { 
    StateListDrawable states = new StateListDrawable(); 
    int identifier = Resources.getSystem().getIdentifier("state_above_anchor", "attr", "android"); 
    states.addState(new int[] {identifier}, ContextCompat.getDrawable(this, R.drawable.popup_bg_below)); 
    states.addState(new int[]{}, ContextCompat.getDrawable(this, R.drawable.popup_bg_above)); 
    return states; 
} 

あなたの要件が満たされることを願っています。私はScrollViewと一緒にさまざまなシナリオでそれをテストしました。そして、それは完璧に動作します。

Popup Below

Popup Above

+0

@Andreyua私はすべてのソースコードを与えました。文字列配列(planets_array)をstrings.xmlに配置してこのコードを実行するだけです。それが動作することを願っています。 – MMBarno

+0

さて、次は何ですか?どのように決定する、 "現在の状態や何かを得る"? – Andreyua

+1

@Andreyua実際にはありません。 PopupWindowは、背景の設定中に自身を処理します。 https://developer.android.com/reference/android/widget/PopupWindow.html、特に「setBackgroundDrawable(Drawable background)」メソッドをフォローアップしてください。あなたはその仕組みをはっきりと理解してくれることを願います – MMBarno

関連する問題