【问题标题】:Aligning Selected Spinner Item对齐选定的微调器项目
【发布时间】:2017-10-27 14:41:13
【问题描述】:

我正在尝试对选定项目在微调器中的位置进行微调。 不是下拉列表项,因为我的适配器中已经有一个自定义视图,而是专门选择的项。

正如您在屏幕截图中看到的,“Any”是当前选中的项目。但它在容器内奇怪地对齐,因为它必须容纳下拉列表中最长的字符串,即“Dark Purple Burnt Sienna”(或其他)。我想将选定的文本向右对齐,以便“任何”在下拉指示器旁边,而不是在中间。

我已尝试调整我的自定义微调器项目视图,但它对所选项目没有任何影响。

我还尝试在 Spinner 本身上设置重力和文本对齐方式,但没有任何效果。

这是图片和xml:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/default_black"
        android:layout_centerVertical="true"
        android:text="Color" />

    <Spinner
        android:id="@+id/spn_color"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"/>

</RelativeLayout>

编辑:这是我的适配器:

public class ColorsAdapter<T> implements SpinnerAdapter {
    ArrayList<String> mColors;
    ArrayList<Integer> mValues;
    Context mContext;

    public ColorsAdapter(ArrayList<String> colors, ArrayList<Integer> values,
                              Context context) {
        mContext = context;
        mColors = colors;
        mValues = values;
    }

    @Override
    public int getCount() {
        return mColors.size();
    }

    @Override
    public Object getItem(int position) {
        return mColors.get(position);
    }

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

    @Override
    public int getItemViewType(int position) {
        return R.layout.list_item_color;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView v = new TextView(mContext);
        v.setText(mColors.get(position));
        return v;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE );
        View row = inflater.inflate(getItemViewType(position), parent, false);
        TextView tvName = (TextView)row.findViewById(R.id.tv_name);
        tvName.setText(mColors.get(position));
        row.setTag(mValues.get(position));
        return row;
    }


    @Override
    public int getViewTypeCount() {
        return 1;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

}

这是列表项的 XML:

<TextView
    android:id="@+id/tv_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:gravity="right"/>

【问题讨论】:

    标签: android android-spinner


    【解决方案1】:

    您可以在getView(int position, View convertView, ViewGroup parent) 方法中调整所选项目的设置。如果你只是想设置重力和文字对齐,你应该在方法中将它设置为TextView

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView v = new TextView(mContext);
        v.setText(mColors.get(position));
        v.setGravity(Gravity.END); // OR v.setGravity(Gravity.RIGHT);
        return v;
    }
    

    或者,如果您想进行进一步的自定义,您可以简单地扩展自定义布局:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        View row = null;
        if (inflater != null) {
            row = inflater.inflate(R.layout.list_item_view_color, parent, false);
            TextView textView = row.findViewById(R.id.textview);
            textView .setText(mColors.get(position));
        }
        return row;
    }
    

    其中list_item_view_color.xml 是所选值的布局文件。
    (注意:如果您想使用 autoSizeTextType 之类的选项,可以在 xml 文件中使用 app 前缀作为 AppCompatTextView

    【讨论】:

      【解决方案2】:

      简单的解决方案是为 spinner TextView 布局 构建另一个Custom view,并在其中为您的TextView 指定gravity。类似的东西:

      <!--spinner_layout.xml (in layout/)-->
      
      <?xml version="1.0" encoding="utf-8"?>
      <TextView
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:gravity="right"
          />
      

      在初始化你的 spinnerArrayAdapter 时使用它:

      ArrayAdapter<String> adapter = new ArrayAdapter<String>
                                         (this, android.R.layout.spinner_layout,
                                          spinnerArray);
      

      界面输出:

      【讨论】:

      • 我已经有一个微调器项目的自定义视图,正如我在描述中提到的那样。设置下拉视图资源对所选项目布局没有任何影响。
      • 它看起来与您在答案中写下的完全一样。您是否能够使用您的代码操纵所选项目的位置?
      【解决方案3】:

      您可以通过编程方式为 getView 方法创建 TextView,因此不会设置对齐属性,简单的做法是按照您在 getDropdownView 上执行此操作的相同方式对其进行充气,或者只是在视图中设置适当的重力你被实例化了。

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
          TextView v = new TextView(mContext);
          v.setText(mColors.get(position));
          v.setGravity(Gravity.RIGHT);
          return v;
      }
      

      【讨论】:

        【解决方案4】:

        你可以试试这个

         android:autoSizeTextType="uniform"
        

        【讨论】:

        • 不幸的是,仅在 API 26 中可用。
        【解决方案5】:

        填充、边距和对齐在谈到 Spinner 时会让人感到困惑。我也遇到了类似的问题。但对我来说,我没有使用自定义视图和适配器,所以我设法使用样式来解决这个问题。 因为您已经在使用自定义视图和适配器,所以您可以将微调器的 背景设为空,这样下拉箭头将不可见。

        android:background="@null"
        

        然后在 TextView 中,您可以将 drawableRight 指定为下拉箭头。

        android:drawableRight="@drawable/ic_spinner_drop_arrow_white_24dp"
        

        图标可以是可绘制的下拉矢量。另外要指定箭头和文本之间的特定边距,您应该能够使用 drawablePadding

        希望这会有所帮助。

        【讨论】:

          【解决方案6】:

          我可以给你一个可行的方法。

          在 XML 中

          1) 添加一个名为 the_current_color 文本视图的新文本视图

          2) 将此文本视图对齐到微调器上方和箭头图标的开头 或任何你想要的地方。

          在您的代码中

          1) 当您从微调器中收听 (on item selected ) 时,只需获取当前文本并将其设置在 (the_current_color) 文本视图中。

          2) 并尝试通过将颜色更改为透明来隐藏微调器中的文本。

          希望有效果

          编辑

          我也可能会提出一些建议,也许它会改变一些事情

          假设我们有一个微调器,它使用这个字符串资源文件来填充它的适配器

          <string-array name="my_adapter">
          
          <item>Blue </item> 
          <item>Red</item> 
          
           </string-array>
          

          到目前为止,我们有一个微调器,在微调器箭头图标的最左侧显示(红色项目)和(蓝色项目)。

          现在像这样创建另一个字符串资源

          <string-array name="my_adapter_two">
          
          <item>           Blue </item> 
          <item>           Red</item> 
          
           </string-array>
          

          正如您现在所看到的,添加的空格会产生一种错觉,即字符串位于箭头图标旁边

          您可以添加适合您需要的空间,您可以在单击某个项目后切换文件,然后将它们切换回来。

          【讨论】:

          • 这可行,但我正在寻找一个不涉及隐藏视图的更官方的解决方案。如果有的话。
          • @jwBurnside 是的官方更好,但正如你所说,所有项目按钮都受到微调器中任何其他长字符串长度的影响,所以我想你唯一的方法是通过代码隐藏和显示视图
          【解决方案7】:

          您可以尝试以下自定义视图。

          <?xml version="1.0" encoding="utf-8"?>
              <TextView xmlns:android="http://schemas.android.com/apk/res/android"
                  android:id="@+id/textView1"
                  android:layout_width="200dp"
                  android:layout_height="wrap_content"
                  android:layout_centerHorizontal="true"
                  android:layout_centerVertical="true"
                  android:gravity="right"
                  android:padding="15dp"
                  android:textAlignment="gravity"
                  android:textColor="@color/black"
                  android:textSize="10dp" />
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-24
            • 1970-01-01
            • 2011-08-12
            • 2013-06-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多