业务的需求是变化莫测的,最近就遇到一个需求是——用户只有点击Dialog的取消按钮才会消失,点击屏幕的时候不消失。Android ICS对UI做了很大的变动,系统提倡使用DialogFragment,但是系统默认的操作习惯是点击屏幕Dialog会自动消失。
为了实现业务的需求,想过使用Dialog风格的Activity,但是做出来的效果和系统的UI效果不匹配,最终只有失败告终。在黔驴技穷的时候,决定再仔细撸一下Android文档,终于在文档中发现了Dialog的setCanceledOnTouchOutside属性,具体使用如下:
方法一:
public class MyAlertDialogFragment extends DialogFragment {
public static MyAlertDialogFragment newInstance(int title) {
MyAlertDialogFragment frag = new MyAlertDialogFragment();
Bundle args = new Bundle();
args.putInt("title", title);
frag.setArguments(args);
return frag;
}
@TargetApi(11)
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
int title = getArguments().getInt("title");
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setIcon(R.drawable.ic_launcher)
.setTitle(title)
.setPositiveButton(R.string.alert_dialog_ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((MainActivity)getActivity()).doPositiveClick();
}
}
)
.setNegativeButton(R.string.alert_dialog_cancel,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
((MainActivity)getActivity()).doNegativeClick();
}
}
)
.create();
dialog.setCanceledOnTouchOutside(false);// 设置点击屏幕Dialog不消失
return dialog;
}
}
方法二:
在oncreate()方法中设置Dialog点击屏幕不可取消,实例代码如下:
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
this.setCancelable(false);// 设置点击屏幕Dialog不消失
int style = DialogFragment.STYLE_NORMAL, theme = 0;
setStyle(style,theme);
}
(提示:提醒大家一下在覆写了onCreateDialog()方法后,就不能覆写onCreateView()方法了)
说到这儿就给大家介绍一下创建DialogFragment的第二种方式吧,第一种方式上面已经叙述了,在此就不再叙述了,直接看第二种实现的具体方式,具体代码如下所示:
import android.app.Activity;
import android.app.DialogFragment;
import android.app.FragmentTransaction;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class PromptDialogFragment
extends DialogFragment
implements View.OnClickListener
{
private EditText et;
public static PromptDialogFragment
newInstance(String prompt)
{
PromptDialogFragment pdf = new PromptDialogFragment();
Bundle bundle = new Bundle();
bundle.putString("prompt",prompt);
pdf.setArguments(bundle);
return pdf;
}
@Override
public void onAttach(Activity act) {
// If the activity we're being attached to has
// not implemented the OnDialogDoneListener
// interface, the following line will throw a
// ClassCastException. This is the earliest we
// can test if we have a well-behaved activity.
OnDialogDoneListener test = (OnDialogDoneListener)act;
super.onAttach(act);
}
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
this.setCancelable(true);
int style = DialogFragment.STYLE_NORMAL, theme = 0;
setStyle(style,theme);
}
// 覆写onCreateView()方法,实现DialogFragment的布局。注意不能同时覆写 onCreateView()和onCreateDialog()方法
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle icicle)
{
View v = inflater.inflate(
R.layout.prompt_dialog, container, false);
TextView tv = (TextView)v.findViewById(
R.id.promptmessage);
tv.setText(getArguments().getString("prompt"));
Button dismissBtn = (Button)v.findViewById(
R.id.btn_dismiss);
dismissBtn.setOnClickListener(this);
Button saveBtn = (Button)v.findViewById(
R.id.btn_save);
saveBtn.setOnClickListener(this);
Button helpBtn = (Button)v.findViewById(
R.id.btn_help);
helpBtn.setOnClickListener(this);
et = (EditText)v.findViewById(R.id.inputtext);
if(icicle != null)
et.setText(icicle.getCharSequence("input"));
return v;
}
@Override
public void onSaveInstanceState(Bundle icicle) {
icicle.putCharSequence("input", et.getText());
super.onPause();
}
@Override
public void onCancel(DialogInterface di) {
Log.v(MainActivity.LOGTAG, "in onCancel() of PDF");
super.onCancel(di);
}
@Override
public void onDismiss(DialogInterface di) {
Log.v(MainActivity.LOGTAG, "in onDismiss() of PDF");
super.onDismiss(di);
}
public void onClick(View v)
{
OnDialogDoneListener act = (OnDialogDoneListener)getActivity();
if (v.getId() == R.id.btn_save)
{
TextView tv = (TextView)getView().findViewById(R.id.inputtext);
act.onDialogDone(this.getTag(), false, tv.getText());
dismiss();
return;
}
if (v.getId() == R.id.btn_dismiss)
{
act.onDialogDone(this.getTag(), true, null);
dismiss();
return;
}
if (v.getId() == R.id.btn_help)
{
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.remove(this);
// in this case, we want to show the help text, but
// come back to the previous dialog when we're done
ft.addToBackStack(null);
//null represents no name for the back stack transaction
HelpDialogFragment hdf =
HelpDialogFragment.newInstance(R.string.help1);
hdf.show(ft, MainActivity.HELP_DIALOG_TAG);
return;
}
}
}
代码比较简单,注释已经写明白了,相信大家都能看懂的!
以上只是设置Dialog的一个小技巧以及创建DialogFragment的两种创建方式,希望对大家有所帮助。 |