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에 힌트를 추가하는 방법
코틀린용
무엇을 얻을 수 있습니까?
- 힌트가 선택된 경우 회색
- 힌트의 회색으로 드롭다운 목록
- 힌트가 아닌 다른 것을 선택한 경우 검은색
선택한 항목에 따라 스피너의 텍스트 색상이 변경되는 단계를 추가했습니다. 여기서 찾을 수 없었기 때문입니다.이 경우 힌트처럼 보이기 위해 첫 번째 항목을 선택할 때 텍스트 색상을 회색으로 변경해야 합니다.
activity_layout.xml에서 스피너를 정의합니다.
<Spinner android:id="@+id/mySpinner" android:layout_width="match_parent" android:layout_height="wrap_content" />
string.xml에서 첫 번째 항목이 힌트가 될 문자열 배열을 정의합니다.
<string-array name="your_string_array"> <item>Hint...</item> <item>Item1</item> <item>Item2</item> <item>Item3</item> </string-array>
Activity.kt의 onCreate 메서드에서 스피너를 설정합니다.
리소스에서 문자열 배열 가져오기
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 } }
드롭다운 보기 리소스를 설정하고 어댑터를 스피너에 연결합니다.
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) mySpinner.adapter = spinnerAdapter
선택한 항목에 따라 스피너의 텍스트 색상 변경
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);
}
}
}
커스텀 스피너를 사용한 이미지의 예시는 동일하지만, 마지막 예시의 결과는 동일할 것입니다.
참고: 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
스피너 프롬프트를 설정할 수 있습니다.
spinner.setPrompt("Select gender...");
언급URL : https://stackoverflow.com/questions/37019941/how-to-add-a-hint-in-spinner-in-xml
'programing' 카테고리의 다른 글
MariaDB 10.3+ Left JOIN 및 사용자 정의 변수가 추가 행을 반환합니다. (0) | 2023.10.09 |
---|---|
git - 분기가 'Origin/Master'보다 1 커밋 앞에 있습니다. (0) | 2023.10.09 |
유튜브 임베디드 코드의 유튜브 썸네일을 워드프레스의 특징 이미지로 설정하는 방법은? (0) | 2023.10.09 |
jasmine.js는 ()가 비동기 콜백 내부에서 작동하지 않을 것으로 예상합니다. (0) | 2023.10.09 |
IPv4 클라이언트/서버 앱에서 IPv6 지원 추가 - sin6_flowinfo 및 sin6_scope_id 필드? (0) | 2023.10.09 |