【问题标题】:Spinner is not seen properly未正确看到微调器
【发布时间】:2020-07-15 04:26:12
【问题描述】:

我有两个微调器。他们看起来像那样。不知道为什么下拉菜单图标离文字很远。

在重力属性设置为“结束”后改变图像

在我的activity_main.xml中是这样写的:

<androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/map_root_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:background="@mipmap/map_bg"
android:orientation="vertical"
app:layoutDescription="@xml/map_scroll">

<FrameLayout
    android:id="@+id/map_top_panel_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@mipmap/home_top"
    android:orientation="vertical"
    android:padding="20dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <Spinner
        android:id="@+id/map_spinner_sector"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start|bottom"
        android:gravity="end"/>

    <Spinner
        android:id="@+id/map_spinner_sorting"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:gravity="end"/>


</FrameLayout>

...

</androidx.constraintlayout.motion.widget.MotionLayout>

SpinnerAdapter.java 类:

public class SpinnerAdapter extends ArrayAdapter<String> {

public SpinnerAdapter(@NonNull Context context, ArrayList<String> items) {
    super(context,0, items);
}


@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    return initView(position, convertView, parent);
}

@Override
public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    return initView(position, convertView, parent);
}


private View initView(int position, View convertView, ViewGroup parent){
    if (convertView == null){
        convertView = LayoutInflater.from(getContext()).inflate(
                R.layout.spinner_item, parent, false
        );
    }

    TextView spinnerTextView = (TextView) convertView;
    spinnerTextView.setText(getItem(position));
    spinnerTextView.setGravity(Gravity.END); //This line is added later

    return convertView;
}
}

还有spinner_item.xml文件,就是spinner items的布局:

<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<Spinner
    android:id="@+id/my_spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

我没有使用 Spinners 的经验。我在学习。我想知道为什么我会遇到这样的错误。

不是:我有 EDITED spinner_item.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spinner_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="3dp"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:background="@drawable/suggestions_bg"
android:textColor="@color/blue_popular" />

【问题讨论】:

    标签: java android graphics spinner android-spinner


    【解决方案1】:

    我刚刚遇到了类似的问题,为了解决这个问题,我必须在微调器中设置属性 gravity
    android:gravity="end" - 这有助于在下拉图标旁边显示项目。

    接下来,我必须以这种方式在我的适配器类中覆盖 getDropDownView

    public View getDropDownView(int position, View convertView,ViewGroup parent) 
    {
        View v = super.getDropDownView(position, convertView,parent);
        ((TextView) v).setGravity(Gravity.END);
        return v;
    }
    

    这有助于在 Spinner 展开时在下拉图标旁边显示项目。你的spinner_item 也是TextView 所以我想你可以复制粘贴这个函数。

    【讨论】:

    • 您的解决方案使微调器下拉图标更靠近项目。但它离物品还很远。而且它也没有影响右边的微调器。它只是影响了左侧的微调器。
    【解决方案2】:

    您的spinner_item.xml 文件不应再次包含 Spinner,只需一个TextView 就足够了,但如果您想要一个花哨的布局,您可以使用其他小部件,例如ImageView。以下是最简单的spinner_item.xml文件示例。

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/custom_text_1"
        style="?android:attr/spinnerItemStyle"
        android:singleLine="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:textAlignment="inherit" />  
    

    现在,摆脱 SpinnerAdapter 类的实现。
    我们可以像这样使用ArrayAdapter 作为Spinner 的适配器:

    // bind your spinner layout from file to a spinner object
    Spinner spinner = findViewById(R.id.map_spinner_sector);
    
    // string array which is the content of the spinner
    // if you already have array or list object, then this 
    // is not needed.
    ArrayList<String> spinnerStringArray = ...; // populate the array backing your adapter
    
    // if you have string array resources in file, 
    // use ArrayAdapter.createFromResource() method to get your array adapter
    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this,
                    R.layout.spinner_item, spinnerStringArray);
    
    spinner.setAdapter(spinnerAdapter);
    
    // set listener to handle item selected event
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    Log.d("Item Selected : ", spinnerStringArray[position]);
                }
    
                public void onNothingSelected(AdapterView<?> parent) {
                }
            });
    

    【讨论】:

    • 如您所说,我已对我的代码进行了更改。但是微调器下拉图标仍然远离项目。那没起效。我编辑了问题,为 spinner_item.xml 添加了当前布局文件
    • spinner_item.xml 中删除paddingEnd 属性。它增加了 10 dp 的空间,这就是我猜下拉菜单移动得更远的原因。
    • 试过了,可惜不影响下拉图标。它只是改变了文本和文本视图边框之间的间隙。
    • 你还在用SpinnerAdapter类吗?我建议您删除该课程并按照我在回答中所说的去做。在股票Spinner 中,下拉图标就在附近。另外,看看你是否在styles.xml 中为Spinner 应用了任何不寻常的样式
    • 我尝试了你在答案中所说的一切,所以是的,我删除了 SpinnerAdapter 类。我的微调视图的风格是默认的。反正我也没改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多