69

項目のテキストがSpinner長すぎて 1 行に収まらない場合、テキストは折り返されずに切り捨てられます。これは、 API レベル >= 11の場合のみです。これは、間違った動作を示すAndroid 4.2.2 (左) と、予想どおりに見えるAndroid 2.3.3 (右) のスクリーンショットです。

android:singleLine="false"ここでは単に無視されます。したがって、他のすべての試行は、 などのようandroid:linesに、何とかウィンドウ幅よりもはるかに広いようです。android:minLinesTextView

他の人が同じ問題を抱えているのを見ましたが、誰も解決策を見つけることができませんでした. それで、これはシステムのバグですか?この OS バージョン間の不一致は、意図したものではないと思います。


ご注意ください:

比較的単純な解決策を示唆する回答がいくつかありました。

  • と同様に、カスタムAdapterとオーバーライドを記述します。これはここでの解決策ではありません。なぜなら、この時点では元の問題が残っているからです:適切な行の折り返しを処理するには、レイアウトはどのように見える必要がありますか?getView()getDropDownView()

  • TextViewドロップダウン ビューの を親にラップしますViewGroupandroid:layout_width="match_parent"親の幅が奇妙に無制限のように見えるため、動作しません。

  • ドロップダウン ビューの幅を固定します。これは、 のさまざまな幅には適していませんSpinner

  • そしてもちろん、\nテキストのどこかに s を手動で挿入することは解決策ではありません。


次のコードで再現します。

更新:これもサンプル プロジェクトとしてGitHubにアップロードしました:ダウンロード

/res/values/arrays.xml:

<string-array name="items">
    <item>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt.</item>
    <item>At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est.</item>
</string-array>

/res/layout/spinner_item.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="none"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:singleLine="false" />

セットAdapter:

spinner.setAdapter(ArrayAdapter.createFromResource(this,
            R.array.items,
            R.layout.spinner_item));
4

15 に答える 15

18

ここでのソリューションの組み合わせのみが機能しました(Android 5.1でもテスト済み):

spinner_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="wrap_content">

  <TextView
    android:id="@android:id/text1"
    style="?android:attr/spinnerItemStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="false"
    android:textAlignment="inherit"/>
</LinearLayout>

コード

  final ArrayAdapter<String> spinnerArrayAdapter=new ArrayAdapter<String>(activity,R.layout.spinner_item,android.R.id.text1,spinnerItemsList)
  {
  @Override
  public View getDropDownView(final int position,final View convertView,final ViewGroup parent)
    {
    final View v=super.getDropDownView(position,convertView,parent);
    v.post(new Runnable()
    {
    @Override
    public void run()
      {
      ((TextView)v.findViewById(android.R.id.text1)).setSingleLine(false);
      }
    });
    return v;
    }
  };
  spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
于 2015-04-23T09:05:37.487 に答える
12

ダイアログスタイルのスピナーに切り替えることで、この問題を解決しました。

<Spinner
  ...
android:spinnerMode="dialog" />
于 2013-07-19T06:28:47.640 に答える
8

私が試したことからSpinner、テーマを使用している間に複数行のドロップダウン項目を達成することはできません。Holo

回避策は次のとおりです。

  • Spinnerから継承しないのスタイルを作成しますHolo。これにより、複数行のドロップダウン アイテムが有効になります。
  • テーマのように見えるように、スピナーを「手動で」スタイリングしHoloます。

これにより生成されます(閉じた状態と開いた状態を示します):

ここに画像の説明を入力

実装の詳細:

ドロップダウン項目の属性をに設定してカスタム レイアウトを指定したとしても、私が知る限り、Holoテーマを継承しSpinnerてドロップダウン項目に複数の行を表示する方法はありません。私もスタイルを維持しようとしましたが、SpinnerTextView singleLinefalseHolo

android:spinnerStyle
android:spinnerItemStyle 
android:spinnerDropDownItemStyle 

スタイル属性 (これらの属性の使用例はこちら) ですが、複数行の結果を生成することはできませんでした。

ただし、 のスタイルをオーバーライドし、からSpinner継承しない場合:spinnerStyleHolo

 <style name="AppTheme" parent="android:Theme.Holo.Light">
    <item name="android:spinnerStyle">@style/spinnerStyle</item>
</style>

<--no parent attribute-->
 <style name="spinnerStyle">
    <item name="android:clickable">true</item>
</style>

ドロップダウン項目は複数行の表示をサポートします。しかし、今では のHoloテーマが失われSpinner、閉じた状態は ではなく、矢印や視覚的な手がかりがないTextViewように見えます。代わりに親を:に設定すると:SpinnerSpinnerspinnerStyleparent="android:style/Widget.Spinner

<style name="spinnerStyle" parent="android:style/Widget.Spinner">
    <item name="android:clickable">true</item>
</style>

閉じた状態では矢印が表示されますが、アプリでは場違いに見えるSpinnerグレーのプレホロのようなスタイルになります。SpinnerHolo

したがって、考えられる解決策は次のとおりです。

  • テーマをオーバーライドし、親にspinnerStyleは使用しないでください。Holoこれにより、ドロップダウン項目で複数行のテキストが有効になります。
  • テーマSpinnerを継承するように背景を変更します。Holo

次に例を示します。

基本的なアクティビティを作成します:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

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

    spinner.setAdapter(ArrayAdapter.createFromResource(this,
            R.array.items,
            R.layout.spinner_item));        
}

アクティビティのレイアウト:

<LinearLayout 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"
    android:padding="50dip"
    tools:context=".MainActivity" >

    <Spinner
        android:id="@+id/styled_spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

スタイル:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="AppTheme" parent="android:Theme.Holo.Light">
        <item name="android:spinnerStyle">@style/spinnerStyle</item>
    </style>
    <style name="spinnerStyle">
        <item name="android:clickable">true</item>
        <item name="android:background">@drawable/spinner_background_holo_light</item>
    </style>
</resources>

drawable フォルダーに、spinner_background_holo_light を配置します。

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false"
        android:drawable="@drawable/spinner_disabled_holo_light" />
    <item android:state_pressed="true"
        android:drawable="@drawable/spinner_pressed_holo_light" />
    <item android:state_pressed="false" android:state_focused="true"
        android:drawable="@drawable/spinner_focused_holo_light" />
    <item android:drawable="@drawable/spinner_default_holo_light" />
</selector>

これらのドローアブルをdrawables-hdpiフォルダーに含めます。

ここに画像の説明を入力 spinner_default_holo_light.9.png

ここに画像の説明を入力 spinner_disabled_holo_light.9.png

ここに画像の説明を入力 spinner_focused_holo_light.9.png

ここに画像の説明を入力 spinner_pressed_holo_light.9.png

Holoこれにより、上記のスクリーンショットに示すように、 をテーマにした閉じた状態と複数行の項目を持つスピナーが生成されます。

この例のドロップダウン項目は テーマではありませんHoloが、ドロップダウン項目の複数行表示が本当に重要な場合は、おそらく許容できるトレードオフです。

この例では、マニフェストでtoとto をandroid:minSdkVersion設定しました。14android:targetSdkVersion17

Holoグラフィックスとspinner_background_holo_light.xmlコードは、HoloEverywhere Copyright (c) 2012 Christophe Versieux、Sergey Shatunov から提供されています。ライセンスの詳細については、リンク先の github プロジェクトを参照してください。

于 2013-01-18T04:24:21.600 に答える
6

私は同じ問題に直面しました。スピナーのドロップダウン リストに 2 行を表示したいのですが、私が見つけたすべての解決策は、このような単純な問題を解決するには不合理に思えます。Spinner のソース コードを調査したところ 、属性 android:singleLine="false" を持つカスタム .xmlを使用する場合に見つかりました

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/multiline_spinner_text_view"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:singleLine="false" />

およびデフォルトの ArrayAdapter、次のコードはListPopupWindowで毎回実行されます

    @Override
       View More obtainView(int position, boolean[] isScrap) {
            View view = super.obtainView(position, isScrap);

           if (view instanceof TextView) {
                ((TextView) view).setHorizontallyScrolling(true);
            }

            return view;        
}

そのため、リスト行ごとに 1 つの文字列行しか表示されず、実際にはスクロールしています。

このような問題を解決するには、ビューを TextView のインスタンスにしないでください。TextView を FrameLayout または LinearLayout 内に配置するだけです。

   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <CheckedTextView
            android:id="@+id/multiline_spinner_text_view"
            android:layout_width="fill_parent"
            android:layout_height="?android:attr/listPreferredItemHeight"
            android:singleLine="false" />

    </LinearLayout>

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
               R.layout.multiline_spinner_dropdown_item,R.id.multiline_spinner_text_view,
                awasomeListValues);

このソリューションは、どちらのスピナー モードでも機能します: MODE_DROPDOWN と MODE_DROPDOWN.

于 2014-02-27T13:36:51.780 に答える
3

Androidにバグがあると思います。これを試すことができます。テキストからスペースを削除してから、正常に機能するように表示します。テキストビューの長さが文字列の長さよりも小さい場合、スペースの後のすべての文字が無視されます。回避策として、これを試すことができます:

サンプル コードを含む res/layout フォルダーに multiline_spinner_dropdown_item.xml という名前のファイルを追加します。

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:attr/spinnerDropDownItemStyle"
android:singleLine="false"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:ellipsize="marquee" />

スピナーを作成するときは、このレイアウトから作成します。

何かのようなもの :

ArrayAdapter.createFromResource(this, items, R.layout.multiline_spinner_dropdown_item);

基本的には、android.R.layout.simple_spinner_dropdown_item レイアウトをプロジェクトにコピーし、CheckedTextView で singleLine 属性を false に設定してレイアウトを変更します。

于 2013-02-01T10:57:24.380 に答える
1
ArrayAdapter<?> specAdapter =
   ArrayAdapter.createFromResource(
       getActivity().getBaseContext(),
       aa[position],
       android.R.layout.select_dialog_item);
specAdapter.setDropDownViewResource(android.R.layout.select_dialog_item);
于 2015-12-28T12:28:55.247 に答える
0

でラップTextViewするだけLinearLayoutです:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
    <TextView
            android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
</LinearLayout>
于 2015-04-16T12:18:35.197 に答える
0

私はこれと同じ問題を抱えていて、解決策を見つけました。

初期表示とドロップダウン ビューでもテキストを折り返す必要がありました。

テキストは初期表示で折り返されていました。ドロップダウンについては、テキストビューを囲む固定幅の線形レイアウトのカスタム ビューを使用することを推奨する別の解決策を見つけました。これにより、スピナーのドロップダウンと最初の選択のドロップダウンが正しく表示されました。ただし、これは古いデバイスで大きな問題を引き起こしました。

他のものを選択しようとすると、最初の表示が更新されず、テキストが積み重ねられたように見えました。下に積み上げられているため、背景を追加しても役に立ちませんでした。 ここに画像の説明を入力

アダプタには setDropDownViewResource() というメソッドがあり、スピナーの最初の選択で表示されるものとは異なるビューをドロップダウンに設定できます。

 import org.holoeverywhere.widget.Spinner;

 ArrayAdapter adapter1 = ArrayAdapter.createFromResource(this,R.array.array_of_strings,R.layout.simple_list_item_1);
 adapter1.setDropDownViewResource(R.layout.my_simple_list_item_1);
 spQ1.setAdapter(adapter1);

この例では、simple_list_item は Android によって提供されるデフォルトのビューであり、my_simple_list_item は

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="300dp"
android:layout_height="wrap_content" >   

<TextView
  android:id="@+id/android:text1"
  android:layout_width="wrap_content"
  android:layout_height="50dp"
  android:ellipsize="marquee"
  android:layout_gravity="center_vertical"
  android:singleLine="false"/>

</LinearLayout> 

テキストは、スピナーのドロップダウン ビュー内およびスピナーの表示された選択範囲内で折り返されます。

于 2013-04-12T23:10:44.137 に答える