您的位置:首页 > 产品设计 > UI/UE

Android:Dialog对话框、Builder、showDialog、模板方法设计模式

2013-05-13 22:00 453 查看
1.Dialog对话框:
public class MainActivity extends Activity implements OnClickListener
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

findViewById(R.id.button1).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.button1:
btn1Click();
break;
case R.id.button2:
btn2Click();
break;
default:
break;
}
}

private void btn1Click()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);

// 设置对话框标题、内容、按钮,set方法每次返回this,即dialog本身
builder.setIcon(R.drawable.ic_launcher);//设置标题图片
builder.setTitle("对话框标题");
builder.setMessage("对话框内容");
builder.setPositiveButton("关闭", null);// 系统只提供三个对话框按钮,区别是默认的显示位置,Neutral在中间
builder.setNegativeButton("确定", new DialogInterface.OnClickListener()// 此处的listener与上面的按钮listener来自于不同包
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Log.e("duihuakuang", "点击了对话框按钮");
}
});
// builder.setNeutralButton("应用", listener);

AlertDialog dialog = builder.create();
dialog.show();//记得加上show()方法
}

// 另一种写法,复用创建对象,模板方法设计模式
private void btn2Click()
{
showDialog(0);//showDialog方法最终实现了onCreateDialog(0)方法
}

//重写onCreateDialog方法,避免重复创建对象
@Override
protected Dialog onCreateDialog(int id)
{
return new AlertDialog.Builder(this).setIcon(R.drawable.ic_launcher)
.setTitle("对话框标题").setMessage("对话框内容").setPositiveButton("关闭", null)
.setNegativeButton("确定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Log.e("duihuakuang", "点击了对话框按钮");
}
}).setNeutralButton("应用", null).create();

// return super.onCreateDialog(id);
}
}


2.定制dialog方法:
@Override
public void onClick(View v)
{
if (v.getId() == R.id.button1)
{
showDialog(1);
}
if (v.getId() == R.id.button2)
{
showDialog(2);
}
}
@Override
@Deprecated
protected Dialog onCreateDialog(int id)
{
if (id == 1)//全定制,使用自定义布局
{
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.dialog_layout);
dialog.findViewById(R.id.button_dialog).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
Toast.makeText(MainActivity.this, "定制对话框", Toast.LENGTH_SHORT).show();
dialog.dismiss();// 关闭对话框
}
});

return dialog;
}

if (id == 2)//半定制,只修改中间布局
{
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.notify_layout, null);
return new AlertDialog.Builder(this).setTitle("半定制对话框").setView(view).setPositiveButton("退出", null).create();
}
return null;

}


3.定制的dialog去掉标题栏和背景色等:
<style name="myDialogTheme" parent="android:Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowNoTitle">true</item><!--除去title-->
<item name="android:windowContentOverlay">@null</item>
<item name="android:backgroundDimEnabled">false</item>
<item name="android:windowBackground">@drawable/ic_touming</item><!--除去背景色,也可以@null-->
</style>


然后:
Dialog dialog = new Dialog(this,R.style.myDialogTheme);


4.activity与dialog对话框之间的交互:

打开对话框:
Bundle bundle = new Bundle();
bundle.putString(HBContant.KEY_BUNDLE_DIALOG, mNotifyStr);
showDialog(1, bundle);


对话框处理:
// 创建注册填写错误提示对话框
@Override
@Deprecated
protected Dialog onCreateDialog(int id)
{
final Dialog dialog = new Dialog(this, R.style.customDialogTheme);
if (id == 1)
{
// 获取activity传送过来的值
dialog.setContentView(R.layout.dialog_singlebtn);
dialog.findViewById(R.id.dialog_ok).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
dialog.dismiss();// 关闭对话框
}
});
}
return dialog;
}

@Override
@Deprecated
//每次弹出对话框时被回调以动态更新对话框内容的方法
protected void onPrepareDialog(int id, Dialog dialog, Bundle args)
{
super.onPrepareDialog(id, dialog, args);
if (id == 1)
{
String str = args.getString(HBContant.KEY_BUNDLE_DIALOG);
TextView dialog_content = (TextView) dialog.findViewById(R.id.dialog_text);
dialog_content.setText(str);
}
}


5.设置对话框的位置和大小
/**
* 初始化查询对话框
*/
private void InitSearchDialog()
{
View searchDialogLayout = getLayoutInflater().inflate(R.layout.handmaterial_productsearch_window, null);
View mBtn_search = searchDialogLayout.findViewById(R.id.productsearch_btn_search);

mBtn_search.setOnClickListener(this);

//创建查询窗口
AlertDialog.Builder builder = new AlertDialog.Builder(this);
mSearchDialog = builder.setIcon(R.drawable.ic_launcher).setTitle("查询").setView(searchDialogLayout).setNegativeButton("取消", null)
.setPositiveButton("保存", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
dialog = null;
}
}).create();
}

/**
* 显示查询对话框
*/
private void showSearchDialog()
{
mSearchDialog.show();

WindowManager wm = getWindowManager();
Display d = wm.getDefaultDisplay();  //为获取屏幕宽、高
android.view.WindowManager.LayoutParams lp = mSearchDialog.getWindow().getAttributes();  //获取对话框当前的参数值
lp.height = (int) (d.getHeight() * 0.8);   //高度设置为屏幕的0.8
lp.width = (int) (d.getWidth() * 0.8);    //宽度设置为屏幕的0.8
mSearchDialog.getWindow().setAttributes(lp);     //设置生效
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: