Android--从零单排系列--常用对话框和DialogFragment的优势
Posted 童政通
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android--从零单排系列--常用对话框和DialogFragment的优势相关的知识,希望对你有一定的参考价值。
(一):DialogFragment的使用
优点:
* 1,屏幕的选择和按下返回键能更好的管理它的什么周期方法
* 2,DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,
类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)
* 3,横竖屏切换,传统的new AlertDialog在屏幕旋转时, 第一不会保存用户输入的值,
而通过DialogFragment实现的对话框则可以完全不必考虑旋转的问题。
##使用方式
* 两种方式创建
* 1,onCreateView即使用定义的xml布局文件展示Dialog。
* 或者
* 2,onCreateDialog即利用AlertDialog或者Dialog创建出Dialog。
方式一:1,onCreateView即使用定义的xml布局文件展示Dialog。
第一步:
写一个EditNameDialogFragment(我没写的dialog) 集成DialogFragment
public class EditNameDialogFragment extends DialogFragment{
/**
* 两种方式创建
* 1,onCreateView即使用定义的xml布局文件展示Dialog。
* 或者
* 2,onCreateDialog即利用AlertDialog或者Dialog创建出Dialog。
*/
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//去掉线条
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
View view = inflater.inflate(R.layout.dialog_fragment, container);
return view;
}
}
第二步:写出DialogFragment的XML文件,然后在第一步引用即可完成
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/id_label_your_name"
android:layout_width="wrap_content"
android:layout_height="32dp"
android:gravity="center_vertical"
android:text="Your name:" />
<EditText
android:id="@+id/id_txt_your_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/id_label_your_name"
android:imeOptions="actionDone"
android:inputType="text" />
<Button
android:id="@+id/id_sure_edit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/id_txt_your_name"
android:text="ok" />
</RelativeLayout>
方式二:2,onCreateDialog即利用AlertDialog或者Dialog创建出Dialog。
第一步:直接代码中解决,这里自定义了一个listenner实现Dialog数据传入到Activity中去
public class LoginLoginDialogFragment extends DialogFragment {
private EditText mUsername;
private EditText mPassword;
public interface LoginInputListenner{
void onLoginInputListenner(String usename,String password);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
View view = getActivity().getLayoutInflater().inflate(R.layout.login_fragment, null);
mUsername = (EditText) view.findViewById(R.id.id_txt_username);
mPassword = (EditText) view.findViewById(R.id.id_txt_password);
builder.setView(view).setPositiveButton("Sign in", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
LoginInputListenner listenner = (LoginInputListenner) getActivity();
listenner.onLoginInputListenner(mUsername
.getText().toString(), mPassword
.getText().toString());
}
}).setNegativeButton("Cancel", null);
return builder.create();
}
}
第二步:第二种创建方式的XML文件布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:layout_width="match_parent"
android:layout_height="64dp"
android:background="#FFFFBB33"
android:contentDescription="@string/app_name"
android:scaleType="center"
/>
<EditText
android:id="@+id/id_txt_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginTop="16dp"
android:hint="input username"
android:inputType="textEmailAddress" />
<EditText
android:id="@+id/id_txt_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginTop="4dp"
android:fontFamily="sans-serif"
android:hint="input password"
android:inputType="textPassword" />
</LinearLayout>
*=========================================华丽的分割线===========================
(二):Dialog的使用
(1)简单警告框
public class MyDialogDemo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
Dialog dialog = new AlertDialog.Builder(this)
.setTitle("对话框") // 创建标题
.setMessage("显示提示信息") // 表示对话框中的内容
.setIcon(R.drawable.pic_m) // 设置LOGO
.create(); // 创建了一个对话框
dialog.show() ; // 显示对话框
}
}
(2)多种操作按钮
public class MyDialogDemo extends Activity {
private Button mybut = null ; // 定义按钮
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
this.mybut = (Button) super.findViewById(R.id.mybut) ; // 取得按钮
this.mybut.setOnClickListener(new OnClickListenerImpl()) ; // 设置事件类
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
Dialog dialog = new AlertDialog.Builder(MyDialogDemo.this)
.setTitle("确定删除?") // 创建标题
.setMessage("您确定要删除该条信息吗?") // 表示对话框中的内容
.setIcon(R.drawable.pic_m) // 设置LOGO
.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setNeutralButton("查看详情", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create(); // 创建了一个对话框
dialog.show() ; // 显示对话框
}
}
(3)退出按钮
public class MyDialogDemo extends Activity {
private ImageButton but = null ; // 定义按钮
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
this.but = (ImageButton) super.findViewById(R.id.but) ; // 取得按钮
this.but.setOnClickListener(new OnClickListenerImpl()) ; // 设置事件类
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
MyDialogDemo.this.exitDialog() ;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) { // 监听键盘
if (keyCode == KeyEvent.KEYCODE_BACK) { // 返回键
this.exitDialog() ;
}
return false ;
}
private void exitDialog(){
Dialog dialog = new AlertDialog.Builder(MyDialogDemo.this)
.setTitle("程序退出?") // 创建标题
.setMessage("您确定要退出本程序吗?") // 表示对话框中的内容
.setIcon(R.drawable.pic_m) // 设置LOGO
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyDialogDemo.this.finish() ; // 操作结束
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create(); // 创建了一个对话框
dialog.show() ; // 显示对话框
}
}
(4)列表对话框
public class MyDialogDemo extends Activity {
private Button mybut = null ; // 定义按钮
private TextView mych = null ; // 定义文本
private String fruitData[] = new String[] { "苹果", "西瓜", "水蜜桃" };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
this.mybut = (Button) super.findViewById(R.id.mybut) ; // 取得按钮
this.mych = (TextView) super.findViewById(R.id.mych) ; // 取得文本
this.mybut.setOnClickListener(new OnClickListenerImpl()) ; // 设置事件类
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
Dialog dialog = new AlertDialog.Builder(MyDialogDemo.this)
.setIcon(R.drawable.pic_m)
.setTitle("请选择你喜欢吃的水果?")
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setItems(MyDialogDemo.this.fruitData, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyDialogDemo.this.mych
.setText("您选择的水果是:"
+ MyDialogDemo.this.fruitData[which]);
}
}).create() ;
dialog.show() ;
}
}
}
(5)单选对话框
public class MyDialogDemo extends Activity {
private Button mybut = null ; // 定义按钮
private TextView mych = null ; // 定义文本
private TextView mytext = null ; // 定义文本
private String fruitData [] = new String[] { "苹果", "西瓜", "水蜜桃" };
private String fruitDesc [] = new String[] {
"苹果,植物类水果,多次花果,具有丰富的营养成分,有食疗、辅助治疗等功能。",
"西瓜(学名:Citrullus Lanatus,英文:Watermelon),属葫芦科,原产于非洲。",
"水蜜桃,在植物分类学上属于蔷薇科,梅属,桃亚属,为落叶小乔木。"} ;
private int chNum = 0 ; // 保存选项
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
this.mybut = (Button) super.findViewById(R.id.mybut) ; // 取得按钮
this.mych = (TextView) super.findViewById(R.id.mych) ; // 取得文本
this.mytext = (TextView) super.findViewById(R.id.mytext) ; // 取得文本
this.mybut.setOnClickListener(new OnClickListenerImpl()) ; // 设置事件类
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
Dialog dialog = new AlertDialog.Builder(MyDialogDemo.this)
.setIcon(R.drawable.pic_m)
.setTitle("请选择你喜欢吃的水果?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyDialogDemo.this.mych
.setText(MyDialogDemo.this.fruitData[MyDialogDemo.this.chNum]); // 设置选项的名称
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).setSingleChoiceItems(MyDialogDemo.this.fruitData, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MyDialogDemo.this.mytext
.setText(MyDialogDemo.this.fruitDesc[which]);
MyDialogDemo.this.chNum = which ; // 保存选项的索引
}
}).create() ;
dialog.show() ;
}
}
}
(6)复选框对话框
public class MyDialogDemo extends Activity {
private Button mybut = null ; // 定义按钮
private TextView mych = null ; // 定义文本
private String fruitData [] = new String[] { "苹果", "西瓜", "水蜜桃" };
private boolean chData[] = new boolean[] { true, true, false };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
this.mybut = (Button) super.findViewById(R.id.mybut) ; // 取得按钮
this.mych = (TextView) super.findViewById(R.id.mych) ; // 取得文本
this.mybut.setOnClickListener(new OnClickListenerImpl()) ; // 设置事件类
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
Dialog dialog = new AlertDialog.Builder(MyDialogDemo.this)
.setIcon(R.drawable.pic_m)
.setTitle("请选择你喜欢吃的水果?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setMultiChoiceItems(MyDialogDemo.this.fruitData,
MyDialogDemo.this.chData,
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which, boolean isChecked) {
for (int x = 0; x < MyDialogDemo.this.fruitData.length; x++) {
if(x == which && isChecked) { // 当前选项被选中
MyDialogDemo.this.mych
.append(MyDialogDemo.this.fruitData[x]
+ "、");
}
}
}
}).create();
dialog.show() ;
}
}
}
(7)进度对话框
public class MyDialogDemo extends Activity {
private Button mybut = null ; // 定义按钮
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
this.mybut = (Button) super.findViewById(R.id.mybut) ; // 取得按钮
this.mybut.setOnClickListener(new OnClickListenerImpl()) ; // 设置事件类
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
final ProgressDialog proDia = ProgressDialog.show(MyDialogDemo.this,
"搜索网络", "请耐心等待...");
new Thread(){
public void run(){ // 线程的主体类
try {
Thread.sleep(3000) ; // 运行三秒
} catch (Exception e) {
} finally {
proDia.dismiss() ; // 关闭对话框
}
}
}.start() ;
proDia.show() ; // 显示对话框
}
}
}
(8)水平进度条
public class MyDialogDemo extends Activity {
private Button mybut = null ; // 定义按钮
private static final int MAX_PROGRESS = 100 ; // 最大值
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
this.mybut = (Button) super.findViewById(R.id.mybut) ; // 取得按钮
this.mybut.setOnClickListener(new OnClickListenerImpl()) ; // 设置事件类
}
private class OnClickListenerImpl implements OnClickListener {
@Override
public void onClick(View view) {
final ProgressDialog proDia = new ProgressDialog(MyDialogDemo.this) ;
proDia.setTitle("搜索网络") ;
proDia.setMessage("请耐心等待") ;
proDia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) ; // 水平进度条
proDia.setMax(MAX_PROGRESS) ; // 设置进度的最大值
proDia.setProgress(30) ; // 从进度30开始
proDia.setButton("后台处理", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
proDia.dismiss() ; // 关闭对话框
}
}) ;
proDia.setButton2("详细信息", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}) ;
proDia.onStart() ; // 启动进度
new Thread(){
public void run(){ // 线程的主体类
for (int x = 0; x < MAX_PROGRESS; x++) {
try {
Thread.sleep(500); // 运行三秒
} catch (Exception e) {
}
proDia.incrementProgressBy(1) ;
}
proDia.dismiss() ;
}
}.start() ;
proDia.show() ; // 显示对话框
}
}
以上是关于Android--从零单排系列--常用对话框和DialogFragment的优势的主要内容,如果未能解决你的问题,请参考以下文章
Android从零单排系列六《Android视图控件——TextView》
Android从零单排系列六《Android视图控件——TextView》
Android从零单排系列六《Android视图控件——TextView》
Android从零单排系列十《Android视图控件——RadioButton》