想在alertdialog上显示一个多个选项的对话框如下
public void showSettingsBox(){
final CharSequence[] items = {"Item1", "Item2", "Item3"};
final boolean checked[] = new boolean[]{false,false,false};
AlertDialog.Builder builder = new AlertDialog.Builder(fLabyrinthGame);
builder.setMessage(fMessage)
.setCancelable(false)
.setMultiChoiceItems(items, checked, new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
CharSequence text = "Item number " + which;
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(fLabyrinthGame, text, duration);
toast.show();
}
})
.setPositiveButton("Apply", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
builder.setTitle(fTitle);
builder.setIcon(R.drawable.icon_exclamation);
AlertDialog alert = builder.create();
alert.show();
}
结果出现一个空白除了最后一个按钮
要想实现功能需要去掉setMessage(fMessage),这是因为setMultiChoiceItems or setItems 是互相冲突的貌似
随便写两句备忘
做手机应用时,会经常遇到UI布局,画一堆按钮、输入框等这样的控件。我以前的做法很笨,就是给每个控件设个index索引,从1开始计,依次累加, 有按键动作时, 根据键值对index进行加、减操作定位控件焦点。
这种做法很容易想到,也很容易实现, 但问题是当有很多控件时,或者焦点切换不是依索引来排的, 这时就遇到麻烦了~
注:大多数windows桌面程序还是依index为序的,比如按Tab键就可以依次往增加索引,按shift+Tab就可以减索引。
经过分析浏览器的焦点管理, 采用算法搜索临近的控件是一种更好的方案。
这里大致先描述思想,空了再贴代码。
控件摆放在屏幕画布上, 必然有x,y,w,h这4种基本属性,再加上一个select属性标识是否获得焦点。 假设暂不考虑动态特效,那么在创建这些控件之处, 把它们存到一个容器里panel, 依据它们的x,y将它们全部画在屏幕上, select = true的控件绘制焦点框。
在按键发生改变时, 要做的就是查找出一个合适的控件, 将其select改为true.
我用到了4种算法,组合起来使用,效果不错:
最短边长计算算法
直线搜索算法
模糊搜索算法
直角三角形求边算法
这样, 不管按键或是触屏, 都能很容易得到焦点。
scroll.fullScroll(View.FOCUS_DOWN) 就可以了