2016-04-16 7 views
3

私のアプリケーションでは、3つのスピナーがあります。テキストを中心に設定すると、1つのスピナーでは機能しますが、他のスピナーでは機能しません。

this question私は探していた答えを見つけましたが、半分しかありませんでした。今、2つの補助スピナーはテキストが中央に表示されていますが、最初のものはありません。

スピナーの.xmlを見ると、センタリングに関する違いは1つのみ表示されますが、2つの補足的なものはandroid:layout_gravity="center"という属性を持っているため、最初のスピナーには適用できません。なぜこれはそうですか?これが理由だろうか?適用されないということは、デザインビューのスピナーのプロパティでなく、手動で.xmlに何も変更を加えないときです。

私が探している答えはなぜ2つの補助スピナーがテキストを中心に置いているのですが、最初のものはありませんか?注:私はポップアップの要素のセンタリングには興味がありません。これは純粋にオプションです。私はちょうど選択されたオプションを中心にしたいと思っています。ここで

は、それが赤で問題に今どのように見えるかのスクリーンショットです:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/some_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
app:layout_behavior="@string/appbar_scrolling_view_behavior" 
tools:context="packagename" 
tools:showIn="@layout/specific_activity_layout" 
android:gravity="center_horizontal" 
android:background="#FF9800"> 

<Spinner 
    android:layout_width="fill_parent" 
    android:layout_height="50dp" 
    android:id="@+id/spinner1" 
    android:entries="@array/spinner1entries" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="15dp" 
    android:gravity="center|top" 
    android:background="@drawable/rounded_corners" 
    android:paddingTop="4dp" 
    android:paddingBottom="4dp" 
    android:popupBackground="#FFB74D" 
    android:layout_alignParentEnd="false" 
    android:textAlignment="center" /> 

<LinearLayout 
    android:id="@+id/horizontal_layout_spinners" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentEnd="false" 
    android:layout_alignParentStart="false" 
    android:visibility="invisible" 
    android:layout_below="@+id/spinner1"> 

    <Spinner 
     android:layout_width="wrap_content" 
     android:layout_height="50dp" 
     android:id="@+id/spinner2" 
     android:visibility="visible" 
     android:background="@drawable/rounded_corners" 
     android:layout_marginRight="5dp" 
     android:popupBackground="#FFB74D" 
     android:textAlignment="center" 
     android:gravity="center|top" 
     android:layout_weight="0.5" 
     android:layout_gravity="center" /> 

    <Spinner 
     android:layout_width="wrap_content" 
     android:layout_height="50dp" 
     android:id="@+id/spinner3" 
     android:visibility="visible" 
     android:layout_marginLeft="5dp" 
     android:background="@drawable/rounded_corners" 
     android:popupBackground="#FFB74D" 
     android:textAlignment="center" 
     android:gravity="center|top" 
     android:layout_weight="0.5" 
     android:layout_gravity="center" /> 

</LinearLayout> 
</RelativeLayout> 

そしてrounded_cornersファイル:

をここ

problem

は、私が使用しています.xmlです

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#FFB74D"/> 
    <stroke android:width="0dip" android:color="#B1BCBE" /> 
    <corners android:radius="10dip"/> 
    <padding android:left="0dip" android:top="0dip" android:right="0dip" android:bottom="0dip" /> 
</shape> 
+0

最初のスピナーでは、 'android:layout_width =" fill_parent "を' android:layout_width = "wrap_content" 'に変更するとどうなりますか? 'android:gravity'はうまく見えますが、そうでない場合は' android:gravity = "center"に変更してみてください。 –

+0

アンドロイド:layout_width = "fill_parent" 'はスピナーを縮小しますが、私はそれを端から端まで持っていたい:( – Phantomazi

+0

スクリーンショットを表示できますか? description。 –

答えて

1
  • android:dropDownWidth="wrap_content"をスピナーに追加してみてください。

  • スピナーからアイテムが選択された後、プログラムでテキストスタイルを設定できます。 setOnItemSelectedListenerを設定し、TextViewを中央に設定します。

    Spinner spinner1 = (Spinner) findViewById(R.id.spinner1); 
    spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
    
        @Override 
        public void onItemSelected(AdapterView<?> arg0, View view, int arg2, long arg3) { 
         // Set the text style after item is selected. 
         setSpinnerSelectedItemParams(spinner1, getActivity()); 
    } 
    
        @Override 
        public void onNothingSelected(AdapterView<?> parent) { 
        } 
    }); 
    
    
    
    /** 
    * Sets the spinner text style to a different one after one value has been chosen. 
    * @param spinner Spinner currently in use 
    */ 
    public void setSpinnerSelectedItemParams(Spinner spinner, Context context) { 
        if (spinner.getChildCount() > 0){ 
         TextView tvSpinner = ((TextView) spinner.getChildAt(0)); 
         tvSpinner.setPadding(0, 0, 0, 0); 
         tvSpinner.setGravity(Gravity.CENTER); 
         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
         params.gravity = Gravity.CENTER; 
         params.setMargins(0, 0, 0, 0); 
         tvSpinner.setLayoutParams(params); 
        } 
    } 
    

    中央でもテキストを選択する前に、カスタムリソースを設定してみてください。活動またはフラグメントで

    ArrayAdapter<String> yourAdapter = new ArrayAdapter(activity, R.layout.default_spinner_adapter_view, yourDataToFillTheSpinner); 
    

    "default_spinner_adapter_view.xml" ファイル:

    <?xml version="1.0" encoding="utf-8"?> 
    <!-- This is the view for each individual item of the spinner--> 
    <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@+id/tv_default_spinner" 
        style="?android:attr/spinnerItemStyle" 
        android:layout_width="match_parent 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:ellipsize="marquee" 
        android:gravity="center" 
        android:singleLine="true" 
        android:textAppearance="?android:attr/textAppearanceMedium" 
        android:textColor="@android:color/black" /> 
    
+0

デフォルトの項目はどうですか?この方法では矛盾しています - もしそれがうまくいけば、それはユーザーの選択後にのみ中央に表示されますが、デフォルトの項目は依然として左に止まってしまいます。 – Phantomazi

+0

@Phantomaziこれを行う方法は、 'ArrayAdapter'を作成するときにカスタムリソースを設定することです。次のようなものがあります: 'ArrayAdapter adapter = new ArrayAdapter(activity、R.layout.spinner_adapter_picker_view_center、yourData);'。答えにそれを含めるようにしましょう。 –

+0

@Phantomaziたとえば、編集された回答を確認します。 –

0

ドロップダウンリストの項目をカスタマイズしたい場合は、新しいレイアウトを作成する必要がありますファイル。さんはspinner_dropdown_item.xmlそれを呼ぶことにしましょう:スピナーの宣言で

<?xml version="1.0" encoding="utf-8"?> 
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    style="?android:attr/spinnerDropDownItemStyle" 
    android:singleLine="true" 
    android:layout_width="match_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:ellipsize="marquee" 
    android:textColor="#aa66cc"/> 

別の変更:

ArrayAdapter adapter = ArrayAdapter.createFromResource(this,R.array.planets_array, R.layout.spinner_item); 
adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); 
spinner.setAdapter(adapter); 
0

スピナーのカスタムリスト項目を作成し、あなたが望むように設定しているが、TextViewのIDがテキスト1を持っている必要がありますこのlist_itemを使用します。

Spinner spinner = (Spinner) findViewById(R.id.spinner); 

//以下のようなXMLは、文字列配列やデフォルトのスピナー レイアウト

//を使用してArrayAdapterを作成する際の選択肢のリストを使用するようにレイアウトを指定します表示されます

adapter.setDropDownViewResource(android.R.layout.your_drop_down_list_item); 
縦とスピナーの幅リニアレイアウトに

//スピナーにアダプタを適用

spinner.setAdapter(adapter); 
0

変更相対的なレイアウトはmatch_parentする必要があります。

0

すべてのスピナーが同じタイプのアダプター—を使用していること、または少なくとも同じアイテムレイアウトを使用する別のアダプター—を使用していることを確認してください。

関連する問題