Дайте прядильщикам ширину выпадающего списка - PullRequest
0 голосов
/ 05 октября 2018

У меня проблема с блесной в макете.

Проблема в том, что мои элементы имеют очень маленькую ширину, и на маленьком экране довольно сложно щелкнуть по ним.

Проверьте картинку на идею.

enter image description here

Нет ли простого способа установить ширину элемента в соответствии с фактической шириной выпадающего меню?

<android.support.v7.widget.AppCompatSpinner
    android:id="@+id/spellSpinner"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:layout_marginStart="10dp"
    android:layout_marginEnd="10dp"
    android:dropDownWidth="match_parent"
    android:spinnerMode="dropdown"
    android:popupBackground="#fff"
    android:background="#8A8A8A"/>

Мой код Java:

spinnerSpells = findViewById(R.id.spellSpinner);
ArrayAdapter < CharSequence > adapter = ArrayAdapter.createFromResource(spellActivity.this, R.array.dropdownCategory, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerSpells.setAdapter(adapter);

spinnerSpells.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
  @Override
  public void onItemSelected(AdapterView << ? > adapterView, View view, int i, long l) {
    getSpellList(spinnerSpells.getSelectedItem().toString(), switchSpells.isChecked());
    // do some other stuff [...]
  }

  @Override
  public void onNothingSelected(AdapterView << ? > adapterView) {
    getSpellList(spinnerSpells.getSelectedItem().toString(), switchSpells.isChecked());
   // do some other stuff [...]
  }
});

С наилучшими пожеланиями CG

PS Я действительно не нашел ни одного поста на форуме по этому вопросу.

Ответы [ 5 ]

0 голосов
/ 08 октября 2018

Если честно, они мне не очень помогли, но дали хороший совет.Я нашел способ, как решить мою проблему самостоятельно (также реализовал изображения перед метками).

По сути, это правильный вызов, чтобы надуть счетчик специальным XML-файлом.Я публикую свой код:

Создан новый класс для моего рекламодателя:

package edmt.dev.androidgridlayout;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class xCustomSpinnerAdapater extends ArrayAdapter<String> {

    Context mContext;
    String[] spinnerNames;
    int[] spinnerImages;

    public xCustomSpinnerAdapater( Context mContext, String[] spinnerNames, int[] spinnerImages) {
        super(mContext, R.layout.x_custom_spinner, spinnerNames);
        this.mContext = mContext;
        this.spinnerNames = spinnerNames;
        this.spinnerImages = spinnerImages;
    }


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

            LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View row = inflater.inflate(R.layout.x_custom_spinner,null);
            TextView tvSpinnerText = row.findViewById(R.id.tvSpinnerText);
            ImageView ivSpinnerImage = row.findViewById(R.id.ivSpinnerImage);

            tvSpinnerText.setText(spinnerNames[position]);
            ivSpinnerImage.setImageResource(spinnerImages[position]);

        return row;
    }

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

        LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.x_custom_spinner,null);
        TextView tvSpinnerText = row.findViewById(R.id.tvSpinnerText);
        ImageView ivSpinnerImage = row.findViewById(R.id.ivSpinnerImage);

        tvSpinnerText.setText(spinnerNames[position]);
        ivSpinnerImage.setImageResource(spinnerImages[position]);

        return row;
    }
}

Соответственно добавлен XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:orientation="horizontal"
    >

    <ImageView
        android:id="@+id/ivSpinnerImage"

        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"

        android:padding="5dp"
        android:src="@drawable/artifact"
        />
    <TextView
        android:id="@+id/tvSpinnerText"

        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="7"
        android:gravity="center"

        android:text="Accessory"
        android:textSize="18sp"

        />

</LinearLayout>

И после этого я отредактировал свою mainActivity следующим образом:

[..]

  private xCustomSpinnerAdapater spinnerAdapter;
    private String[] spinnerNames = {"All", "Black", "Blue", "Green", "Red"};
    private  int[] spinnerImages = {R.drawable.artifact, R.drawable.black, R.drawable.blue, R.drawable.green, R.drawable.red};


[..]

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_spell);
        
        spinnerSpells = findViewById(R.id.spellSpinner);
        spinnerAdapter = new xCustomSpinnerAdapater(this, spinnerNames,spinnerImages);
        spinnerSpells.setAdapter(spinnerAdapter);


        spinnerSpells.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(getApplicationContext(),spinnerNames[i],Toast.LENGTH_LONG).show();
               [...]
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                [...]
        });

Использование layout_width = "match_parent" в XML-файле в Linearlayout решило мою проблему в значительной степени.

СС наилучшими пожеланиями CG

0 голосов
/ 05 октября 2018
  1. список массивов счетчиков Пусть это будет dropdownCategory.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="dropdownCategory">
            <item>All</item>
            <item>Black</item>
            <item>Blue</item>
            <item>Green</item>
            <item>Red</item>
        </string-array>
    </resources>
    
  2. макет, имеющий счетчик

    <android.support.v7.widget.AppCompatSpinner
     android:id="@+id/spellSpinner"
     android:layout_width="0dp"
     android:layout_height="match_parent"
     android:layout_weight="1"
     android:layout_marginStart="10dp"
     android:layout_marginEnd="10dp"
     android:dropDownWidth="wrap_content"
     android:spinnerMode="dropdown"
     android:popupBackground="#fff"
     android:background="#8A8A8A"/>
    
  3. В классе Activity.java в onCreate

    Spinner spinnerSpells = findViewById(R.id.spellSpinner);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(spellActivity.this, R.array.dropdownCategory, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerSpells.setAdapter(adapter);
    
    spinnerSpells.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
     // do something [...]
     }
    
    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {
       // do something [...]
    });
    

Я хотел бы, чтобы это помогло вам

0 голосов
/ 05 октября 2018

используйте пользовательский XML-файл для элемента прядильщика.

произнесите spinner_item.xml и укажите настроенный размер и цвет текста, если хотите

<?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:textSize="20sp"
android:gravity="left"  
android:textColor="#FF0000"         
android:padding="5dip"
/>

, используйте этот файл, чтобы показать прядильщикизделия, такие как:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
R.layout.spinner_item,list);
0 голосов
/ 05 октября 2018

Создайте отдельный макет для текстового представления счетчика

R.layout.spinner_text

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    android:maxLines="1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="your_size_in_dp" />

и настройте свой адаптер следующим образом

ArrayAdapter < CharSequence > adapter = ArrayAdapter.createFromResource(spellActivity.this, R.array.dropdownCategory, R.layout.spinner_text);
0 голосов
/ 05 октября 2018

Использовать атрибут в формате xml

    android:dropDownWidth="fill_parent| match_parent| wrap_content"
    android:spinnerMode="dropdown"

Для просмотра дополнительных сообщений: https://developer.android.com/reference/android/widget/Spinner.html#setDropDownWidth(int)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...