566
汽車大全
Android 4.0設置Dialog點擊屏幕不消失
業務的需求是變化莫測的,最近就遇到一個需求是——用戶隻有點擊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的兩種創建方式,希望對大家有所幫助
最後更新:2017-04-03 12:56:36