Android Spinner를 팝업으로 생성하려면 어떻게해야합니까?
사용자가 항목을 선택할 수 있도록 사용자가 메뉴 항목을 탭할 때 스피너 대화 상자를 표시하고 싶습니다.
이를 위해 별도의 대화 상자가 필요합니까 아니면 Spinner를 직접 사용할 수 있습니까? 이 링크를 보고 MODE_DIALOG 옵션을 언급했지만 더 이상 정의되지 않은 것 같습니다. AlertDialog는 괜찮을 수 있지만 모든 옵션에는 "목록에서 항목을 클릭해도 대화 상자가 닫히지 않습니다."라는 메시지가 표시됩니다. 어떠한 제안?
이상적으로 코드는 스피너가 화면에 표시되는 경우와 유사합니다.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity,
android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
myspinner.setAdapter(adapter);
// myspinner.showAsDialog() <-- what i want
경고 대화 상자를 사용할 수 있습니다.
AlertDialog.Builder b = new Builder(this);
b.setTitle("Example");
String[] types = {"By Zip", "By Category"};
b.setItems(types, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
switch(which){
case 0:
onZipRequested();
break;
case 1:
onCategoryRequested();
break;
}
}
});
b.show();
원하는대로 그 중 하나를 누르면 대화 상자가 닫힙니다. 도움이 되었기를 바랍니다!
에서 XML 옵션이 있습니다
android:spinnerMode="dialog"
이를 사용하는 대화 모드
이 시도:
Spinner popupSpinner = new Spinner(context, Spinner.MODE_DIALOG);
자세한 내용은이 링크 를 참조하십시오.
MODE_DIALOG
및 MODE_DROPDOWN
API 11 (허니 콤)에 정의되어 있습니다. MODE_DIALOG
이전 플랫폼 버전의 일반적인 동작을 설명합니다.
android:spinnerMode="dialog"
팝업에 스피너 내용을 표시하는 것처럼 작은 속성을 추가 합니다.
사용자 정의 대화 상자를 만들 수 있습니다. 꽤 쉽습니다. 당신은 회 전자의 선택과 그것을 해제하려면, 다음을 추가 OnItemClickListener
하고 추가
int n = mSpinner.getSelectedItemPosition();
mReadyListener.ready(n);
SpinnerDialog.this.dismiss();
확인 버튼의 OnClickListener에서와 같습니다. 그러나 한 가지주의 사항이 있으며 기본 옵션을 다시 선택하면 onclick 리스너가 실행되지 않는다는 것입니다. 확인 버튼도 필요합니다.
레이아웃으로 시작 :
res / layout / spinner_dialog.xml :
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/dialog_label"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="Please select an option"
/>
<Spinner
android:id="@+id/dialog_spinner"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
/>
<Button
android:id="@+id/dialogOK"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:text="OK"
android:layout_below="@id/dialog_spinner"
/>
<Button
android:id="@+id/dialogCancel"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:text="Cancel"
android:layout_below="@id/dialog_spinner"
android:layout_toRightOf="@id/dialogOK"
/>
</RelativeLayout>
그런 다음 클래스를 만듭니다.
src / your / package / SpinnerDialog.java :
public class SpinnerDialog extends Dialog {
private ArrayList<String> mList;
private Context mContext;
private Spinner mSpinner;
public interface DialogListener {
public void ready(int n);
public void cancelled();
}
private DialogListener mReadyListener;
public SpinnerDialog(Context context, ArrayList<String> list, DialogListener readyListener) {
super(context);
mReadyListener = readyListener;
mContext = context;
mList = new ArrayList<String>();
mList = list;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spinner_dialog);
mSpinner = (Spinner) findViewById (R.id.dialog_spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String> (mContext, android.R.layout.simple_spinner_dropdown_item, mList);
mSpinner.setAdapter(adapter);
Button buttonOK = (Button) findViewById(R.id.dialogOK);
Button buttonCancel = (Button) findViewById(R.id.dialogCancel);
buttonOK.setOnClickListener(new android.view.View.OnClickListener(){
public void onClick(View v) {
int n = mSpinner.getSelectedItemPosition();
mReadyListener.ready(n);
SpinnerDialog.this.dismiss();
}
});
buttonCancel.setOnClickListener(new android.view.View.OnClickListener(){
public void onClick(View v) {
mReadyListener.cancelled();
SpinnerDialog.this.dismiss();
}
});
}
}
마지막으로 다음과 같이 사용하십시오.
mSpinnerDialog = new SpinnerDialog(this, mTimers, new SpinnerDialog.DialogListener() {
public void cancelled() {
// do your code here
}
public void ready(int n) {
// do your code here
}
});
Here is an Spinner subclass which overrides performClick() to show a dialog instead of a dropdown. No XML required. Give it a try, let me know if it works for you.
public class DialogSpinner extends Spinner {
public DialogSpinner(Context context) {
super(context);
}
@Override
public boolean performClick() {
new AlertDialog.Builder(getContext()).setAdapter((ListAdapter) getAdapter(),
new DialogInterface.OnClickListener() {
@Override public void onClick(DialogInterface dialog, int which) {
setSelection(which);
dialog.dismiss();
}
}).create().show();
return true;
}
}
For more information read this article: How To Make Android Spinner Options Popup In A Dialog
You can use a spinner and set the spinnerMode to dialog, and set the layout_width and layout_height to 0, so that the main view does not show, only the dialog (dropdown view). Call performClick in the button click listener.
mButtonAdd.setOnClickListener(view -> {
spinnerAddToList.performClick();
});
Layout:
<Spinner
android:id="@+id/spinnerAddToList"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:prompt="@string/select_from_list"
android:theme="@style/ThemeOverlay.AppCompat.Light"
android:spinnerMode="dialog"/>
The advantage of this is you can customize your spinner any way you want.
See my answer here to customize spinner: Overriding dropdown list style for Spinner in Dialog mode
android:spinnerMode="dialog"
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, categories);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
spinner.setAdapter(dataAdapter);
This is from the Android SDK source code. As you can see you have a special constructor to create a Spinner with the specified mode you wanna use.
Hope it will help you :)
/**
* Construct a new spinner with the given context's theme, the supplied attribute set,
* and default style. <code>mode</code> may be one of {@link #MODE_DIALOG} or
* {@link #MODE_DROPDOWN} and determines how the user will select choices from the spinner.
*
* @param context The Context the view is running in, through which it can
* access the current theme, resources, etc.
* @param attrs The attributes of the XML tag that is inflating the view.
* @param defStyle The default style to apply to this view. If 0, no style
* will be applied (beyond what is included in the theme). This may
* either be an attribute resource, whose value will be retrieved
* from the current theme, or an explicit style resource.
* @param mode Constant describing how the user will select choices from the spinner.
*
* @see #MODE_DIALOG
* @see #MODE_DROPDOWN
*/
public Spinner(Context context, AttributeSet attrs, int defStyle, int mode) {
super(context, attrs, defStyle);
If you want to show it as a full screen popup, then you don't even need an xml layout. Here's how do do it in Kotlin.
val inputArray: Array<String> = arrayOf("Item 1","Item 2")
val alt_bld = AlertDialog.Builder(context);
alt_bld.setTitle("Items:")
alt_bld.setSingleChoiceItems(inputArray, -1) { dialog, which ->
if(which == 0){
//Item 1 Selected
}
else if(which == 1){
//Item 2 Selected
}
dialog.dismiss();
}
val alert11 = alt_bld.create()
alert11.show()
참고URL : https://stackoverflow.com/questions/6286847/how-do-i-create-an-android-spinner-as-a-popup
'Program Tip' 카테고리의 다른 글
Go 프로그래밍 언어는 어떤 언어로 작성 되나요? (0) | 2020.12.09 |
---|---|
객체 지향 언어의 HAS-A, IS-A 용어 (0) | 2020.12.09 |
Django 템플릿에서 {{또는}}을 이스케이프하는 방법은 무엇입니까? (0) | 2020.12.09 |
자바 스크립트는 주어진 크기의 빈 배열을 만듭니다. (0) | 2020.12.09 |
AWS Lambda 함수가 CloudWatch에 로깅 (텍스트 출력)하도록 할 수 없음 (0) | 2020.12.09 |