web-dev-qa-db-ja.com

スピナーアイテムのカスタムレイアウト

アラートダイアログ内にスピナーがあります。スピナーアイテム間のパディングを減らしたかったので、次のように実装しました。

spinner_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="30dp"
    Android:background="#fff" >

    <TextView
        Android:id="@+id/tvCust"
        Android:layout_width="200dp"
        Android:layout_height="30dp"
        Android:gravity="left|center_vertical"
        Android:textColor="#000"
        Android:textSize="15sp" />

    <RadioButton
        Android:layout_width="wrap_content"
        Android:layout_height="30dp"
        Android:layout_alignParentRight="true" />

</RelativeLayout>

アクティビティコードには次のものが含まれます:

spinner= (Spinner) dialog.findViewById(R.id.spinner);
String arr[] = { "1", "2", "3" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
CameraActivity.this, R.layout.spinner_row, R.id.tvCust,arr);
spinner.setAdapter(adapter);

以下のスクリーンショットでわかるように、ラジオボタンが実際にはspinner_row.xmlの一部であるスピナーに表示されています。テキストビューの幅は200dpですが、スピナーの長さは130dpしかないため、スピナーにラジオボタンが表示されるべきではないことに注意してください。どうすれば削除できますか?

また、スピナーアイテムのいずれかをクリックしても、スピナーポップアップが期待どおりに消えません(3つのチェックボックスすべてがスピナーアイテムリストでチェックされていることに注意してください)。アイテムのクリックでsetOnItemSelectedListenerが呼び出されません。

助けていただければ幸いです。

screenshot

編集1

farrukhの提案に従って、私は彼のコードを試しましたが、次の結果が得られました。

screenshot

10
GAMA

私はこれを持っています

enter image description here

この

enter image description here

これらのxmlコードで

spinadapt.xmlという名前のアダプターのxml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="30dp"
Android:background="#fff" >

<TextView
    Android:id="@+id/tvCust"
    Android:layout_width="wrap_content"
    Android:layout_height="30dp"
    Android:layout_toLeftOf="@+id/radioButton1"
    Android:gravity="left|center_vertical"
    Android:textColor="#000"
    Android:textSize="15sp" />

    <RadioButton
        Android:layout_width="wrap_content"
        Android:layout_height="30dp"
        Android:layout_alignParentRight="true" />

</RelativeLayout>

および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">

<TextView
    Android:id="@+id/spinner1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentLeft="true"
    Android:layout_alignParentTop="true" 
    Android:hint="Select item"
    Android:background="@drawable/spin"/>

</RelativeLayout>

およびJavaコードはMainActivity.Javaという名前のクラスです

public class MainActivity extends Activity
{
    Spinner sp;
    TextView tv;
    String[]  counting={"One","Two","Three","Four"};
    @Override
    protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            sp=new Spinner(this);
            tv=(TextView)findViewById(R.id.spinner1);
            tv.setOnClickListener(new OnClickListener()
                {                       
                    @Override
                    public void onClick(View v)
                        {
                            sp.performClick();
                        }
                });
            sp.setAdapter(new Adapter(MainActivity.this, counting));
            sp.setOnItemSelectedListener(new OnItemSelectedListener()
                {
                    @Override
                    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3)
                        {
                            tv.setText(counting[arg2]);
                        }
                    @Override
                    public void onNothingSelected(AdapterView<?> arg0)
                        {
                        }
                });
        }
}

およびAdapter.Javaという名前のアダプタクラス

public class Adapter extends BaseAdapter
{
    LayoutInflater inflator;
    String[] mCounting;

    public Adapter( Context context ,String[] counting)
        {
            inflator = LayoutInflater.from(context);
            mCounting=counting;
        }

    @Override
    public int getCount()
        {
            return mCounting.length;
        }

    @Override
    public Object getItem(int position)
        {
            return null;
        }

    @Override
    public long getItemId(int position)
        {
            return 0;
        }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
        {
            convertView = inflator.inflate(R.layout.spinadapt, null);
            TextView tv = (TextView) convertView.findViewById(R.id.tvCust);
            tv.setText(Integer.toString(position));
            return convertView;
        }
}

これは完璧に機能しています

これが役立つことを願っています

11
farrukh