web-dev-qa-db-ja.com

Androidウィジェットの右側に下向き三角形のないスピナーを作成する方法

ユーザーが多くの入力項目を持っている画面があるので、画面スペースは限られています。

画面上のウィジェットの外観(ユーザーが押す前)を、Spinnerの右側にあるEditTextまたはSpinnerウィジェットの左部分(通常の下向き三角形なし)に似せたい。その後、ユーザーがウィジェットを押すと、通常のスピナー選択ダイアログが表示されます。

これを達成するために変更できるスピナースタイルの属性はありますか?

私はこのようなコードを見ることができませんでした。

ありがとう

42
Mike

できることの1つは、SpinnerのソースコードをAndroidコードベースから、関連するレイアウトとリソースと共に取得し、それらを使用して独自のカスタムウィジェットを作成することです(おそらく、レイアウトから矢印を削除し、必要に応じてコードを少し調整する必要があります)。

編集:あなたは正しい、その投稿に続いて、それは実際には本当に簡単でした:)あなたは2つのことをしなければなりません。まず、res/valuesの下にstyles.xmlファイルを作成し、それを開いて次を追加します。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style parent="@Android:style/Widget.Spinner" name="SpinnerAsEditText">
        <item name="Android:background">@Android:drawable/edit_text</item>
    </style>
</resources>

次に、レイアウトに次のようにスピナーを追加します。

<Spinner style="@style/SpinnerAsEditText" anyOtherAttributeYouNeed="..."></Spinner>

これで、スピナーは単純なEditTextのように見えますが、その無駄で厄介な下矢印は表示されません。

40
lencinhaus

これはかなり古い質問ですが、私はまだ関連があると思うので、ここに私の答えがあります:

最も簡単な方法

lencinhausの答えは正しいです。動作しますが、さらに簡単な方法で実行できます。別の背景を追加するだけです。以下の例では、より均一なルックアンドフィールのために標準のButtonバックグラウンドを使用しています。

<Spinner
    Android:id="@+id/my_spinner"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:Prompt="@string/my_Prompt" 
    Android:background="@Android:drawable/btn_default"
    />       

他の答えで使用されているスタイルは、ウィジェットに背景を適用する以上のものではありません。これはウィジェットに直接行うことができ、新しいxmlファイルの必要性を節約できます。もちろん、とにかくスピナーにスタイルを適用する場合、そのアプローチには何の問題もありません。

どうして?

それがどのように機能するかを理解するための鍵は、9パッチPNGの説明にあります。右と下の行は、パディングに使用されます。つまり、コンテンツが使用するスペースを確保します。この場合、内部のテキスト。標準のスピナーの背景は、使用可能なテキスト領域の外側にある矢印が右側にある画像を使用します。図については、以下の図1を参照してください。

図1.オリジナルのSpinner bacground 9-patch PNG http://tinypic.com/images/404.gif
図1.元のSpinner bacground 9-patch PNG。

パディングが残っているため、矢印を削除するだけでは十分ではありません。パディングを減らした新しい9パッチイメージ(図1に基づく例については図2を参照)を使用するか、EditText@Android:drawable/edit_text)またはButton@Android:drawable/btn_default)。

Figure 2. Modified Spinner bacground 9-patch PNG with reduced padding
図2.パディングを減らしたSpinner bacground 9-patch PNGの変更

これを理解することで、Spinner(および実際には、任意のウィジェット)の独自の背景を作成できます。

9パッチファイルのより良い説明 ここにあります

SDKからdraw9patch実行可能ファイル( こちらで読む )を使用してファイルを作成するのは非常に簡単ですが、それを妨げるものはありません代わりにPhotoshopまたはGimpを使用します。 9パッチPNGは単なるPNGであることに注意してください!唯一の注意点は、ピクセルの外側の線にのみ描画し、残りのピクセルは完全に透明であることを確認することです。 境界線の近くでアンチエイリアス処理すると、予期しない結果が生じる可能性があります。

67
Aleadam

私のスピナーが三角形のインジケーターを表示していなかったので、私はちょうどこの質問にたどり着きました、今私は理由を理解しています:私は背景を「白」に設定していました:

Android:background="#FFFFFFFF"

これにより、三角形のインジケーター(スピナーの背景画像とAleadamが指定したパディング)が削除されます。

私の問題については、背景を「白」に設定するためだけに親LinearLayoutを追加して解決します。

15
pvalle

背景を指定すると、矢印が消えます。

Android:background="@drawable/bg"
8
Kai Wang

私は同じ問題を抱えていて、スタイルを次のように変更しました:

style="@style/Widget.AppCompat.Light.DropDownItem.Spinner"

そしてそれは働いた。

DropDownItemにあります。

一方、下の三角形を持つものは法線と呼ばれます。

乾杯!

3
Abdullah Umer

実際にスピナーをクリックしたときに使用されるスペースの関連する問題について、私は偶然、右側の大きな選択インジケーターを削除できることを発見しました。行で区切られた基本的なリストが表示されますが、アイテムをクリックしても機能します。

このようなスピナーを設定して、選択インジケーターを取得します。

    Spinner s1 = (Spinner) findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.petals, Android.R.layout.simple_spinner_item);
    adapter1.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
    s1.setAdapter(adapter1);

インジケータがない場合は、setDropDownViewResource行を省略します。

2
Alan Finners

リストとのダイアログに行きませんか。要件に応じて、edittextフィールドを作成し、setOnFocusChangeListenerを追加してから、onFocusChange()メソッドでリストアイテムのダイアログを表示します。リスト項目のあるダイアログの場合

new AlertDialog.Builder(this)
                .setTitle("<Title>")
                .setItems(R.array.<ItemsArrayName>, new DialogInterface.OnClickListener(){
     @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub  
}}).show();
1
Venugopal

答えは私には役に立たなかったので、ここでは非常にシンプルな1行のソリューションが機能しました。

  //some spinner initialisation stuff->
mySpinner.setAdapter(adapter);

  //some spinner initialisation stuff->
mySpinner.getBackground().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

デフォルトのスピナーレイアウトだけで機能するかどうかはわかりませんが、他のニーズのために作成したカスタムではうまく機能しました。

0
Nor Kagramanian