最近做东西经常用到dialog,但一般都是直接在主Activity里调用AlertDialog,相信这也是很多人很熟悉的用法。但有时候我们想要自定义的dialog,而且功能可能会比较繁杂,此时我们就可以单独来写一个类继承Dialog类,同时采用接口回调机制来到主Activity里处理相应的事件。我在网上看了一些资料,自己又总结了一下,分享出来供大家参考借鉴。
我在这里做了一个很简单的demo,就是在dialog的编辑框里输入一些文字,然后按下按钮在主界面上显示出来,就是这么简单,相信很多刚学Android的同学也会很容易理解的。
首先当然是创建一个类并且继承Dialog,这里我就取名为MyDialog。并创建相应的构造函数,另外在构造函数的参数里有一个接口对象,这也是我们后面我们要用到的比较重要的参数。
然后就是创建一个接口,并建立相应的方法。
public interface dialogListener{
public void onClick(View view);
public void gettext(String str);
}
接下来就是跟在Activtiy中操作就是基本一样的了,在onCreate方法里初始化相应的控件,并作相应的操作。这里要说明的一点是不能像在Activity里那样监听按钮,因为我们所创建的MyDialog类是继承的Dialog类的DialogInterface,而DialogInterface已经实现了onClickListener,所以在这里进行按钮监听的时候要写全。
BtnOk.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
}
});
另外我们进行回调的时候是通过接口对象调用其相应的方法来实现的。
private dialogListener listener;
........
listener.gettext(editText.getText().toString());
在我们的主Activity了,通过实现接口的匿名内部类,并实现其方法,来获得MyDialog中处理所得到的数据。
new dialogListener() {
public void onClick(View view) {
}
public void gettext(String str) {
}
};
下面是demo的全部代码,贴出了供大家参考。
MyDialog类代码
package com.example.dialogutil;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MyDialog extends Dialog implements OnClickListener{
private dialogListener listener;
private EditText editText;
public interface dialogListener{
public void onClick(View view);
public void gettext(String str);
}
public MyDialog(Context context,dialogListener listener) {
super(context);
this.listener=listener;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_test);
initView();
}
public void initView() {
Button BtnOk=(Button) findViewById(R.id.button1);
Button BtnCancle=(Button) findViewById(R.id.button2);
TextView textView=(TextView) findViewById(R.id.textView1);
editText=(EditText) findViewById(R.id.editText2);
BtnOk.setOnClickListener(this);
BtnCancle.setOnClickListener(this);
BtnOk.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.gettext(editText.getText().toString());
dismiss();
}
});
BtnCancle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
}
}
MainActivity代码
package com.example.dialogutil;
import com.example.dialogutil.MyDialog.dialogListener;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity implements OnClickListener{
private Button BtnDialog;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BtnDialog=(Button) findViewById(R.id.BtnDialog);
textView=(TextView) findViewById(R.id.textView1);
BtnDialog.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.BtnDialog:
MyDialog dialogBack=new MyDialog(MainActivity.this, new dialogListener() {
public void gettext(String str) {
textView.setText(str);
}
@Override
public void onClick(View view) {
}
});
dialogBack.show();
break;
default:
break;
}
}
}
xml布局文件我就不贴出来来了,很简单,主界面就一个Button和一个TextView,dialog中一个EditText和两个Button。自定义主要是方便在把自己想要实现的都可以在一个类里进行处理,就跟在Activity中处理控件很相似,只不过要注意我提到的部分,如果要进行数据传递,就采用接口回调机制。好了,我也是新手,如果有不对的地方请多指正,大家共同学习。