Luc*_*arr 40 android android-alertdialog
我有一个警告对话框,其中包含一个选项列表和两个按钮:一个OK按钮和一个cancel按钮.下面的代码显示了我是如何实现它的.
private final Dialog createListFile(final String[] fileList) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Compare with:");
builder.setSingleChoiceItems(fileList, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Log.d(TAG,"The wrong button was tapped: " + fileList[whichButton]);
}
});
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {}
});
return builder.create();
}
Run Code Online (Sandbox Code Playgroud)
我的目标是在点击按钮时获取所选单选按钮的名称OK.我试图将字符串保存在变量中,但在内部类中,可以只访问最终变量.有没有办法避免使用最终变量来存储选定的单选按钮?
E-R*_*Riz 142
使用最终变量显然不起作用(因为它只能在声明时分配一次).所谓的"全局"变量通常是代码气味(特别是当它们成为Activity类的一部分时,通常是创建AlertDialogs的地方).更干净的解决方案是将DialogInterface对象转换为AlertDialog,然后调用getListView().getCheckedItemPosition().像这样:
new AlertDialog.Builder(this)
.setSingleChoiceItems(items, 0, null)
.setPositiveButton(R.string.ok_button_label, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition();
// Do something useful withe the position of the selected radio button
}
})
.show();
Run Code Online (Sandbox Code Playgroud)
Kir*_*irk 16
这已经回答得很好,但我一直在谷歌找到这个答案,我想分享一个非匿名的类解决方案.我自己更喜欢可重复使用的课程,可能对其他人有帮助.
在这个例子中,我正在使用一个DialogFragment实现并通过回调方法检索一个值.
从Dialog获取值的回调方法可以通过创建公共接口来完成
public interface OnDialogSelectorListener {
public void onSelectedOption(int selectedIndex);
}
Run Code Online (Sandbox Code Playgroud)
另外,DialogFragment工具DialogInterface.OnClickListener,这意味着你可以注册一个已经实现的类OnClickListener为DialogFragment正在创建.
例如
public Dialog onCreateDialog(Bundle savedInstanceState) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
builder.setTitle(R.string.select);
builder.setSingleChoiceItems(mResourceArray, mSelectedIndex, this);
builder.setPositiveButton(R.string.ok, this);
builder.setNegativeButton(R.string.cancel, this);
return builder.create();
}
Run Code Online (Sandbox Code Playgroud)
这条线
builder.setSingleChoiceItems(mResourceArray, mSelectedIndex, this);
使用mResourceArray中存储的资源数组中的选项创建一个选择对话框.这也预先选择了存储在mSelectedIndex中的选项索引,最后它将自己设置为OnClickListener.(如果这段有点令人困惑,请参阅最后的完整代码)this
现在,您可以在OnClick方法中获取对话框中的值
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case Dialog.BUTTON_NEGATIVE: // Cancel button selected, do nothing
dialog.cancel();
break;
case Dialog.BUTTON_POSITIVE: // OK button selected, send the data back
dialog.dismiss();
// message selected value to registered callbacks with the
// selected value.
mDialogSelectorCallback.onSelectedOption(mSelectedIndex);
break;
default: // choice item selected
// store the new selected value in the static variable
mSelectedIndex = which;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这里发生的是当选择一个项目时,它存储在一个变量中.如果用户单击" 取消"按钮,则不会发回任何更新,也不会发生任何更改.如果用户单击"确定"按钮,则会将值返回到Activity通过创建的回调创建的值.
例如,以下是如何从a创建对话框FragmentActivity.
final SelectorDialog sd = SelectorDialog.newInstance(R.array.selector_array, preSelectedValue);
sd.show(getSupportFragmentManager(), TAG);
Run Code Online (Sandbox Code Playgroud)
这里,资源数组_R.array.selector_array_是要在对话框中显示的字符串数组,preSelectedValue是要在打开时选择的索引.
最后,您FragmentActivity将实现OnDialogSelectorListener并将收到回调消息.
public class MyActivity extends FragmentActivity implements OnDialogSelectorListener {
// ....
public void onSelectedOption(int selectedIndex) {
// do something with the newly selected index
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这对某人有帮助,因为我花了很多时间去理解它.这里DialogFragment有一个带回调的完整实现.
public class SelectorDialog extends DialogFragment implements OnClickListener {
static final String TAG = "SelectorDialog";
static int mResourceArray;
static int mSelectedIndex;
static OnDialogSelectorListener mDialogSelectorCallback;
public interface OnDialogSelectorListener {
public void onSelectedOption(int dialogId);
}
public static DialogSelectorDialog newInstance(int res, int selected) {
final DialogSelectorDialog dialog = new DialogSelectorDialog();
mResourceArray = res;
mSelectedIndex = selected;
return dialog;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mDialogSelectorCallback = (OnDialogSelectorListener)activity;
} catch (final ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnDialogSelectorListener");
}
}
public Dialog onCreateDialog(Bundle savedInstanceState) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity());
builder.setTitle(R.string.select);
builder.setSingleChoiceItems(mResourceArray, mSelectedIndex, this);
builder.setPositiveButton(R.string.ok, this);
builder.setNegativeButton(R.string.cancel, this);
return builder.create();
}
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case Dialog.BUTTON_NEGATIVE:
dialog.cancel();
break;
case Dialog.BUTTON_POSITIVE:
dialog.dismiss();
// message selected value to registered calbacks
mDialogSelectorCallback.onSelectedOption(mSelectedIndex);
break;
default: // choice selected click
mSelectedIndex = which;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
评论中的问题如何从一个Fragment而不是一个来调用它Activity.
首先做一些改动DialogFragment.
删除onAttach事件,因为这不是这种情况下最简单的方法.
添加新方法以添加对回调的引用
public void setDialogSelectorListener (OnDialogSelectorListener listener) {
this.mListener = listener;
}
Run Code Online (Sandbox Code Playgroud)
在你的实现中实现监听器 Fragment
public class MyFragment extends Fragment implements SelectorDialog.OnDialogSelectorListener {
// ....
public void onSelectedOption(int selectedIndex) {
// do something with the newly selected index
}
}
Run Code Online (Sandbox Code Playgroud)
现在创建一个新实例并传入一个引用Fragment来使用它.
final SelectorDialog sd = SelectorDialog.newInstance(R.array.selector_array, preSelectedValue);
// this is a reference to MyFragment
sd.setDialogSelectorListener(this);
// mActivity is just a reference to the activity attached to MyFragment
sd.show(this.mActivity.getSupportFragmentManager(), TAG);
Run Code Online (Sandbox Code Playgroud)
final CharSequence[] choice = {"Choose from Gallery","Capture a photo"};
int from; //This must be declared as global !
AlertDialog.Builder alert = new AlertDialog.Builder(activity);
alert.setTitle("Upload Photo");
alert.setSingleChoiceItems(choice, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (choice[which] == "Choose from Gallery") {
from = 1;
} else if (choice[which] == "Capture a photo") {
from = 2;
}
}
});
alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (from == 0) {
Toast.makeText(activity, "Select One Choice",
Toast.LENGTH_SHORT).show();
} else if (from == 1) {
// Your Code
} else if (from == 2) {
// Your Code
}
}
});
alert.show();
Run Code Online (Sandbox Code Playgroud)
正如其他人指出的那样, 实现 'com.google.android.material:material:1.0.0'更简单
有关更多信息,请参阅此材料指南。https://material.io/develop/android/docs/getting-started/
CharSequence[] choices = {"Choice1", "Choice2", "Choice3"};
boolean[] choicesInitial = {false, true, false};
AlertDialog.Builder alertDialogBuilder = new MaterialAlertDialogBuilder(getContext())
.setTitle(title)
.setPositiveButton("Accept", null)
.setNeutralButton("Cancel", null)
.setMultiChoiceItems(choices, choicesInitial, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
}
});
alertDialogBuilder.show();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
78423 次 |
| 最近记录: |