programing

XML에서 스피너에 힌트를 추가하는 방법

codeshow 2023. 10. 9. 23:39
반응형

XML에서 스피너에 힌트를 추가하는 방법

스피너 위젯에 힌트를 추가하려고 합니다.에서와 같은 힌트 옵션이 없기 때문입니다.EditText, 성별을 힌트로 표시하고 클릭하면 힌트가 아닌 남성과 여성만 표시해야 합니다.

XML을 사용해서만 수행할 수 있는 방법

스피너의 XML 코드입니다.

  <Spinner
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:id="@+id/spinner1"
      android:entries="@array/gender"
      android:layout_marginTop="10dp"
      android:layout_marginLeft="25dp"
      android:layout_marginRight="25dp"
      android:layout_gravity="center_horizontal" />

스피너의 문자열 배열

<string-array name="gender">
     <item>Male</item>
     <item>Female</item>
</string-array>

어댑터에서 첫 번째 항목을 사용 안 함으로 설정할 수 있습니다.아래는 샘플 코드입니다.

@Override
public boolean isEnabled(int position) {
    if (position == 0) {
        // Disable the first item from Spinner
        // First item will be use for hint
        return false;
    } else {
        return true;
    }
}

그리고 첫번째 아이템을 그레이 컬러로 설정합니다.

@Override
public View getDropDownView(int position, View convertView,
                                    ViewGroup parent) {
    View view = super.getDropDownView(position, convertView, parent);
    TextView tv = (TextView) view;
    if (position == 0) {
        // Set the hint text color gray
        tv.setTextColor(Color.GRAY);
    } else {
        tv.setTextColor(Color.BLACK);
    }
    return view;
}

그리고 사용자가 첫 번째 항목을 선택하면 아무것도 하지 않습니다.

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    String selectedItemText = (String) parent.getItemAtPosition(position);
    // If user change the default selection
    // First item is disable and it is used for hint
    if (position > 0) {
        // Notify the selected item text
        Toast.makeText(getApplicationContext(), "Selected : " + selectedItemText, Toast.LENGTH_SHORT).show();
    }
}

자세한 내용은 아래 링크를 참조하시기 바랍니다.

Android에서 Spinner에 힌트를 추가하는 방법

코틀린용

무엇을 얻을 수 있습니까?

  • 힌트가 선택된 경우 회색

Gray color if the hint is selected

  • 힌트의 회색으로 드롭다운 목록

Drop down list with gray color of the hint

  • 힌트가 아닌 다른 것을 선택한 경우 검은색

Black color if something else than the hint is selected

선택한 항목에 따라 스피너의 텍스트 색상이 변경되는 단계를 추가했습니다. 여기서 찾을 수 없었기 때문입니다.이 경우 힌트처럼 보이기 위해 첫 번째 항목을 선택할 때 텍스트 색상을 회색으로 변경해야 합니다.

  1. activity_layout.xml에서 스피너를 정의합니다.

    <Spinner
        android:id="@+id/mySpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    
  2. string.xml에서 첫 번째 항목이 힌트가 될 문자열 배열을 정의합니다.

    <string-array name="your_string_array">
        <item>Hint...</item>
        <item>Item1</item>
        <item>Item2</item>
        <item>Item3</item>
    </string-array>
    
  3. Activity.ktonCreate 메서드에서 스피너를 설정합니다.

    리소스에서 문자열 배열 가져오기

        val items= resources.getStringArray(R.array.your_string_array)
    

    스피너 어댑터 만들기

        val spinnerAdapter= object : ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, items) {
    
        override fun isEnabled(position: Int): Boolean {
            // Disable the first item from Spinner
            // First item will be used for hint
            return position != 0
        }
    
        override fun getDropDownView(
            position: Int,
            convertView: View?,
            parent: ViewGroup
        ): View {
            val view: TextView = super.getDropDownView(position, convertView, parent) as TextView
            //set the color of first item in the drop down list to gray
            if(position == 0) {
                view.setTextColor(Color.GRAY)
            } else {
                //here it is possible to define color for other items by
                //view.setTextColor(Color.RED)
            }
            return view
        }
    
    }
    
  4. 드롭다운 보기 리소스를 설정하고 어댑터를 스피너에 연결합니다.

    spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)     
    mySpinner.adapter = spinnerAdapter
    
  5. 선택한 항목에 따라 스피너의 텍스트 색상 변경

    mySpinner.onItemSelectedListener = object: AdapterView.OnItemSelectedListener{
        override fun onNothingSelected(parent: AdapterView<*>?) {
        }
    
        override fun onItemSelected(
            parent: AdapterView<*>?,
            view: View?,
            position: Int,
            id: Long
        ) {
            val value = parent!!.getItemAtPosition(position).toString()
            if(value == items[0]){
                (view as TextView).setTextColor(Color.GRAY)
            }
        }
    
    }
    

스피너를 사용할 수 있는 방법은 두 가지입니다.

정적인 방법

android:spinnerMode="dialog"

다음을 설정합니다.

android:prompt="@string/hint_resource"

역동적인 방식

spinner.setPrompt("Gender");

참고: 힌트처럼 작동하지만 실제로는 작동하지 않습니다.

도움이 되기를!

1단계:

배열이 약간.마지막 아이템 너의 힌트

Ex: 개인 문자열[] 배열 = 새 문자열[] {"Staff", "학생", "당신의 힌트"};

2단계:

HintAdapter.java 만들기(복사해서 붙여넣기만 하면 됨)

이 클래스는 마지막 항목을 반환하지 않습니다.힌트가 안 뜨네요.

힌트Adapter.java

package ajax.com.vvcoe.utils;

import android.content.Context;
import android.widget.ArrayAdapter;

import java.util.List;


public class HintAdapter  extends ArrayAdapter<String> {


public HintAdapter(Context context, int resource) {
    super(context, resource);
}

public HintAdapter(Context context, int resource, int textViewResourceId) {
    super(context, resource, textViewResourceId);
}

public HintAdapter(Context context, int resource, String[] objects) {
    super(context, resource, objects);
}

public HintAdapter(Context context, int resource, int textViewResourceId, String[] objects) {
    super(context, resource, textViewResourceId, objects);
}

public HintAdapter(Context context, int resource, List<String> objects) {
    super(context, resource, objects);
}

public HintAdapter(Context context, int resource, int textViewResourceId, List<String> objects) {
    super(context, resource, textViewResourceId, objects);
}

@Override
public int getCount() {
    // don't display last item. It is used as hint.
    int count = super.getCount();
    return count > 0 ? count - 1 : count;
}
}

3단계:

스피너 어댑터를 이렇게 설정합니다.

    HintAdapter hintAdapter=new HintAdapter(this,android.R.layout.simple_list_item_1,yourArray);
    yourSpinner.setAdapter(hintAdapter);
    // show hint
    yourSpinner.setSelection(hintAdapter.getCount());

이 답변에서 @Yakiv Mospan에게 크레딧이 전달됩니다 - https://stackoverflow.com/a/22774285/3879847

일부 변경사항만 수정합니다.

이것은 아주 간단한 방법으로 할 수 있습니다.내장된 값(android)을 사용하여 어댑터를 설정하는 대신R.layout.simple_list_item_1), TextView와 DropDown 모두에 대해 자신만의 xml 레이아웃을 만들어 사용합니다.TextView 레이아웃에서 힌트 텍스트 및 힌트 색상을 정의합니다.마지막 단계에서 Strings에 정의된 항목 배열의 첫 번째 항목으로 항목을 생성하고 비웁니다.

<string-array name="professional_qualification_array">
    <item></item>
    <item>B.Pharm</item>
    <item>M.Pharm</item>
    <item>PharmD</item>
</string-array>

Spinner TextView(spnr_qualification.xml)에 대한 XML 레이아웃 만들기

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:hint="Qualification"
    android:textColorHint="@color/light_gray"
    android:textColor="@color/blue_black" />

스피너 DropDown에 대한 XML 레이아웃을 만듭니다.(drpdn_qual.xml)

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerDropDownItemStyle"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:ellipsize="marquee"
android:textColor="#FFFFFF"/>

주 XML 레이아웃에서 스피너 정의

<Spinner
android:id="@+id/spnQualification"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:paddingLeft="10dp"
android:paddingBottom="5dp"
android:paddingTop="5dp"
/>

그리고 마지막으로 코드에서 스피너의 어댑터를 설정하면서 사용자 정의 XML 레이아웃을 사용합니다.

ArrayAdapter<CharSequence> qual_adapter = ArrayAdapter.createFromResource(this, R.array.professional_qualification_array,R.layout.spnr_qualification);

qual_adapter.setDropDownViewResource(R.layout.drpdn_qual);

spnQualification.setAdapter(qual_adapter)

도시처럼 당신의 스트링 배열에서 당신의 힌트를 만들어 보세요. 이것이 힌트입니다.

array_city = new String[]{"Irbed", "Amman", "City"};

그리고 어레이 어댑터에

ArrayAdapter<String> adapter_city = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, array_city) {
            @Override
            public int getCount() {
                // to show hint "Select Gender" and don't able to select
                return array_city.length-1;
            }
        };

그래서 어댑터는 처음 두개의 아이템만 반환하고 마지막으로 create() method or what , , , spinner가 힌트를 선택하게 합니다.

yourSpinner.setSelection(array_city.length - 1);

코틀린을 위해서!!

스피너의 마지막 항목을 숨기기 위한 사용자 지정 어레이 어댑터

 import android.content.Context
 import android.widget.ArrayAdapter
 import android.widget.Spinner

 class HintAdapter<T>(context: Context, resource: Int, objects: Array<T>) :
    ArrayAdapter<T>(context, resource, objects) {

    override fun getCount(): Int {
        val count = super.getCount()
        // The last item will be the hint.
        return if (count > 0) count - 1 else count
    }
}

스피너에 힌트를 설정하는 스피너 확장 기능

fun Spinner.addHintWithArray(context: Context, stringArrayResId: Int) {
    val hintAdapter =
        HintAdapter<String>(
            context,
            android.R.layout.simple_spinner_dropdown_item,
            context.resources.getStringArray(stringArrayResId)
        )
    hintAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    adapter = hintAdapter
    setSelection(hintAdapter.count)
}

사용방법: Spinner에 컨텍스트와 배열을 전달하여 확장자를 추가

spinnerMonth.addHintWithArray(context, R.array.months)

참고: 힌트는 문자열 배열의 마지막 항목이어야 합니다.

<string-array name="months">
    <item>Jan</item>
    <item>Feb</item>
    <item>Mar</item>
    <item>Apr</item>
    <item>May</item>
    <item>Months</item>
</string-array>

가장 간단한 방법은 텍스트 뷰 또는 선형 레이아웃을 만들고 스피너와 함께 상대 레이아웃에 배치하는 것입니다.처음에는 텍스트 뷰에 "Select one..."라는 힌트처럼 텍스트가 표시됩니다. 이 텍스트 뷰는 보이지 않고 비활성화되며 바로 뒤에 있는 스피너를 호출합니다.

1단계:

스피너 퍼팅을 찾는 activity.xml에서 다음을 수행합니다.

 <RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <Spinner
        android:id="@+id/sp_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:spinnerMode="dropdown" />
    <LinearLayout
        android:id="@+id/ll_hint_spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:gravity="center">
        <TextView

            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="Select..."/>

    </LinearLayout>
</RelativeLayout>

2단계:

Activity.java에서 다음을 입력합니다.

public class MainActivity extends AppCompatActivity {

    private LinearLayout ll_hint_spinner;
    private Spinner sp_main;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ll_hint_spinner = findViewById(R.id.ll_hint_spinner);
        sp_main = findViewById(R.id.sp_main);
        //Action after clicking LinearLayout / Spinner;
        ll_hint_spinner.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //By clicking "Select ..." the Spinner is requested;
                sp_main.performClick();
                //Make LinearLayout invisible
                setLinearVisibility(false);
                //Disable LinearLayout
                ll_hint_spinner.setEnabled(false);
                //After LinearLayout is off, Spinner will function normally;
                sp_main.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        sp_main.setSelection(position);
                    }
                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {
                        setLinearVisibility(true);
                    }
                });
            }
        });
    }
    //Method to make LinearLayout invisible or visible;
    public void setLinearVisibility(boolean visible) {
        if (visible) {
            ll_hint_spinner.setVisibility(View.VISIBLE);
        } else {
            ll_hint_spinner.setVisibility(View.INVISIBLE);
        }
    }
}

예제1 동일한 예2 동일한 예3

커스텀 스피너를 사용한 이미지의 예시는 동일하지만, 마지막 예시의 결과는 동일할 것입니다.

참고: github에 예제가 있습니다: 여기를 클릭하세요!

비결은 이 대사입니다.

((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.login_input_hint_color));

onItem에서 사용합니다.선택된.여기에 더 많은 문맥을 가진 내 코드가 있습니다.

List<String> list = getLabels(); // First item will be the placeholder
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(mContext, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                // First item will be gray
                if (position == 0) {
                    ((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.login_input_hint_color));
                } else {
                    ((TextView) view).setTextColor(ContextCompat.getColor(mContext, R.color.primary_text));
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });

저에게 효과가 있었던 것은 당신이 스피너를 처음에 힌트를 포함한 아이템들의 목록으로 설정하는 것입니다.

    final MaterialSpinner spinner = (MaterialSpinner) findViewById(R.id.spinner);

    spinner.setItems("Select something in this list", getString(R.string.ABC), getString(R.string.ERD), getString(R.string.KGD), getString(R.string.DFK), getString(R.string.TOE));

사용자가 실제로 목록에서 무언가를 선택할 때 spinner.setItems 메서드를 사용하여 힌트 이외의 모든 항목으로 목록을 설정합니다.

       spinner.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener<String>() {

            @Override public void onItemSelected(MaterialSpinner view, int position, long id, String item) {
                spinner.setItems(getString(R.string.ABC), getString(R.string.ERD), getString(R.string.KGD), getString(R.string.DFK), getString(R.string.TOE));

}

사용자가 목록에서 무언가를 선택하는 즉시 힌트가 제거됩니다.

드롭다운 목록에서 누락된 '힌트'를 간신히 추가했습니다.제 코드가 좀 이상하게 보인다면 제가 Xamarin을 사용하고 있기 때문입니다.Android는 C#에 있지만 모든 목적을 위해 Java와 동등한 효과가 있어야 합니다.

요점은 GetDropDownView 메서드의 힌트인지 탐지하는 사용자 지정 ArrayAdapter를 만들었다는 것입니다.그렇다면 빈 XML을 부풀려서 드롭다운에서 힌트를 숨깁니다.

내 spinnerItem.xml은...

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinnerText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="@dimen/text_left_padding"
    android:textAppearance="?android:attr/textAppearanceLarge"/>

힌트를 숨길 '빈' 힌트SpinnerDropdownItem.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="wrap_content"/>

나는 CustomObj 배열을 힌트 없이 통과합니다.그래서 힌트가 부모 컨스트럭터로 전달되기 전에 처음에 힌트를 추가로 삽입하는 AddPrompt 메소드를 가지고 있습니다.

public class CustomArrayAdapter: ArrayAdapter<CustomObj>
{

    private const int HintPosition = 0;
    private const CustomObj HintValue = null;
    private const string Hint = "Hint";

    public CustomArrayAdapter(Context context, int textViewResourceId, CustomObj[] customObjs) : base(context, textViewResourceId, AddPrompt(customObjs))
    {


    private static CustomObj[] AddPrompt(CustomObj[] customObjs)
    {
        CustomObj[] customObjsWithHint = new CustomObj[customObjs.Length + 1];
        CustomObj[] hintPlaceholder = { HintValue };
        Array.Copy(hintPlaceholder , customObjsWithHint , 1);
        Array.Copy(customObjs, 0, customObjsWithHint , 1, customObjs.Length);
        return customObjsWithHint ;
    }

    public override Android.Views.View GetView(int position, Android.Views.View convertView, ViewGroup parent)
    {
        CustomObj customObj = GetItem(position);
        bool isHint = customObj == HintValue;

        if (convertView == null)
        {
            convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.spinnerItem, parent, false);
        }

        TextView textView = convertView.FindViewById<TextView>(Resource.Id.spinnerText);
        textView.Text = isHint ? Hint : customObj.Value;
        textView.SetTextColor(isHint ? Color.Gray : Color.Black);

        return convertView;

    public override Android.Views.View GetDropDownView(int position, Android.Views.View convertView, ViewGroup parent)
    {
        CustomObj customObj = GetItem(position);

        if (position == HintPosition)
        {
            convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.hintSpinnerDropdownItem, parent, false);
        }
        else
        {
            convertView = LayoutInflater.From(base.Context).Inflate(Resource.Layout.spinnerItem, parent, false);
            TextView textView = convertView.FindViewById<TextView>(Resource.Id.spinnerText);
            textView.Text = customObj.Value;
        }

        return convertView;
    }
}

위치가 '0'인 경우 OnItemSelectedListener에서 NothingSelected 메서드를 호출하면 매우 간단합니다.저한테는 잘 됐어요.

      spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            **if (position == 0)
            {
                onNothingSelected(parent);
            }**
            else {

                String mechanicType = mechanicTpes[position];
                Toast.makeText(FirstUser.this, "Mechanic Tpye : "+mechanicType, Toast.LENGTH_SHORT).show();
            }




        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            Toast.makeText(FirstUser.this, "NOTHING SELECTED IN SPINNER", Toast.LENGTH_SHORT).show();


        }
    });

가볍고 사용자 지정이 가능한 라이브러리로 답변 보기

https://stackoverflow.com/a/73085435/6694920

enter image description here

스피너 프롬프트를 설정할 수 있습니다.

spinner.setPrompt("Select gender...");

언급URL : https://stackoverflow.com/questions/37019941/how-to-add-a-hint-in-spinner-in-xml

반응형