在EditText中的Spinner

7
我有一个带有右侧drawable [v]的Edittext,使其看起来像一个下拉菜单。现在,我该如何实现它呢?我需要将edittext设置为可点击,然后当我点击它时,会弹出一个对话框片段,其中包含一个列表(看起来像是下拉菜单选项)。
是否可能实现这个功能?
   <android.support.design.widget.TextInputLayout
    android:id="@+id/tilAppCategory"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="15dp"
    >

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edtAppCategory"
        android:hint="Category"
        android:fontFamily="sans-serif-light"
        android:textColorHint="@color/textColorHint"
        android:maxLines="1"
        android:gravity="center|start"
        android:inputType="textNoSuggestions"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="14sp"
        android:drawableEnd="@drawable/icon_spinner_down"
        android:focusableInTouchMode="true"
        android:clickable="true"
        />

</android.support.design.widget.TextInputLayout>
4个回答

5

在@Chetan的答案的帮助下,我创建了这个小部件,可能对任何人都有所帮助。 请使用

setOptions

方法提供选项列表。

 public class DropDown extends AppCompatTextView implements View.OnClickListener {

        private ArrayList<String> options = new ArrayList<>();

        public DropDown(Context context) {
            super(context);
            initView();
        }

        public DropDown(Context context, AttributeSet attrs) {
            super(context, attrs);
            initView();
        }

        public DropDown(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            initView();
        }

        private void initView() {
            this.setOnClickListener(this);
        }

        private PopupWindow popupWindowsort(Context context) {

            // initialize a pop up window type
            PopupWindow popupWindow = new PopupWindow(context);
            popupWindow.setWidth(this.getWidth());

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_dropdown_item_1line,
                    options);
            // the drop down list is a list view
            ListView listViewSort = new ListView(context);

            // set our adapter and pass our pop up window contents
            listViewSort.setAdapter(adapter);

            // set on item selected
            listViewSort.setOnItemClickListener((parent, view, position, id) -> {
                this.setText(options.get(position));
                popupWindow.dismiss();
            });

            // some other visual settings for popup window
            popupWindow.setFocusable(true);
            // popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.white));
            popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);

            // set the listview as popup content
            popupWindow.setContentView(listViewSort);

            return popupWindow;
        }

        @Override
        public void onClick(View v) {
            if (v == this) {
                PopupWindow window = popupWindowsort(v.getContext());
                window.showAsDropDown(v, 0, 0);
            }
        }

        public void setOptions(ArrayList<String> options) {
            this.options = options;
        }
}

在你的布局文件中。
<com.yourdomian.app.DropDown
    style="@style/formDropDown"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/ship_to_address" />

在您的样式文件中。
<style name="formDropDown">
    <item name="android:paddingRight">20dp</item>
    <item name="android:paddingLeft">24dp</item>
    <item name="android:paddingTop">20dp</item>
    <item name="android:paddingBottom">20dp</item>
    <item name="android:textSize">13sp</item>
    <item name="android:background">@drawable/edit_text_background_dark_round</item>
    <item name="android:layout_marginTop">10dp</item>
    <item name="android:elevation">5dp</item>
    <item name="android:drawableRight">@drawable/ic_down_arrow</item>
    <item name="android:gravity">center_vertical</item>
</style>

在你的Java文件中

ArrayList<String> options = new ArrayList<>();
    options.add("Option 1");
    options.add("Option 2");
    options.add("Option 3");
    options.add("Option 4");

    ((DropDown)findViewById(R.id.dropdown)).setOptions(options);

输出结果将是 这里输入图像描述


4
您可以在XML文件中按以下方式操作:在EditTextTextView中,您可以使用android:drawableRight设置左、右、上和下的图标。
<EditText
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:drawableRight="@drawable/ic_menu_share"/>

展示列表,例如下拉菜单,请使用 AutoCompleteTextView
Android AutoCompleteTextView 根据保留的单词自动完成单词,因此无需写出单词的所有字符。
Android AutoCompleteTextView 是可编辑的文本字段,它在下拉菜单中显示建议列表,用户可以仅选择一个建议或值。
Android AutoCompleteTextView 是 EditText 类的子类。MultiAutoCompleteTextView 是 AutoCompleteTextView 类的子类。
你也可以使用 Android PopupWindow Listview 示例。 Android AutoCompleteTextView 示例教程
/**
  * handle header listview onclick event
  */
 private OnClickListener showPopupWindow() {
  return new OnClickListener() {

   @Override
   public void onClick(View v) {
    PopupWindow popUp = popupWindowsort();
    popUp.showAsDropDown(v, 0, 0); // show popup like dropdown list
   }
  };
 }

 /**
  * show popup window method reuturn PopupWindow
  */
 private PopupWindow popupWindowsort() {

  // initialize a pop up window type
  popupWindow = new PopupWindow(this);

  ArrayList<String> sortList = new ArrayList<String>();
  sortList.add("A to Z");
  sortList.add("Z to A");
  sortList.add("Low to high price");

  ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,
    sortList);
  // the drop down list is a list view
  ListView listViewSort = new ListView(this);

  // set our adapter and pass our pop up window contents
  listViewSort.setAdapter(adapter);

  // set on item selected
  listViewSort.setOnItemClickListener(onItemClickListener());

  // some other visual settings for popup window
  popupWindow.setFocusable(true);
  popupWindow.setWidth(250);
  // popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.white));
  popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);

  // set the listview as popup content
  popupWindow.setContentView(listViewSort);

  return popupWindow;
 }

在下面的链接中找到完整的实现: Android PopupWindow ListView 示例。

没错,我编辑了我的帖子。我不能使用AutoCompleteTextView,因为我将在选择类别时使用它。 - Paul John Pulumbarit
因此,您需要添加带有适配器的ListView,并将其可见性设置为Gone,在按钮单击时,您可以使其可见并在onitemclick()上执行操作。 - Chetan Joshi
我选择了第二个方案,谢谢你:) - MFQ

4
您可以使用AutocompleteTextView来实现这一点。
<AutoCompleteTextView
                        android:id="@+id/acType"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:maxLines="1"
                        android:paddingBottom="@dimen/lef_margin"
                        android:paddingTop="@dimen/lef_margin"
                        android:singleLine="true"
                        android:textSize="@dimen/header_text_large"/>


ArrayAdapter arrayAdapter= new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, dataList);
    acType.setAdapter(arrayAdapter);
    acType.setInputType(0);



acType.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus)
                acType.showDropDown();
        }
    });

我无法使用AutoCompleteTextView,因为我将从“自定义”微调器中选择一个类别。我不想使用微调器,因为我还想使用文本输入布局。 - Paul John Pulumbarit

0
public class DropDownEditText extends AutoCompleteTextView {
    private float x;

    public DropDownEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCompoundDrawablesWithIntrinsicBounds(null, null, context.getDrawable(R.drawable.ic_spinner_caret), null);
        setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_spinner_dropdown_item, new String[]{"one", "two", "three", "four"}));
    }

    @Override
    public boolean performClick() {
        if (x < (getRight() - getCompoundDrawables()[2].getBounds().width()))
            return super.performClick();
        showDropDown();
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            x = event.getX();
        }
        return super.onTouchEvent(event);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接