简单模仿android3.0的Dialog。
先上图。当然,我写的都是比较简单的,但是按照这种方法,各种布局都是可以实现的。
DialogView:
public class DialogView extends LinearLayout{
public static final int WIDTH = 32;
private Context mContext;
private LinearLayout contentView;
private ImageView icon;
private TextView title;
private TextView ok;
private TextView cancel;
private ImageView img;
private LayoutInflater inflater;
public DialogView(Context c) {
this(c, null);
}
public DialogView(Context c, AttributeSet a) {
super(c, a);
this.setBackgroundResource(R.drawable.dialog_full_holo_dark);
this.setPadding(60, 50, 60, 55);
this.setGravity(Gravity.CENTER_HORIZONTAL);
this.setOrientation(LinearLayout.VERTICAL);
mContext = c;
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//标题布局
LinearLayout tLayout = new LinearLayout(c);
tLayout.setOrientation(LinearLayout.HORIZONTAL);
tLayout.setGravity(Gravity.CENTER_VERTICAL);
//标题图片
icon = new ImageView(c);
tLayout.addView(icon);
//标题文字
title = new TextView(c);
title.setPadding(10, 10, 10, 10);
title.setTextColor(Color.WHITE);
tLayout.addView(title);
this.addView(tLayout);
//标题线
ImageView hr = new ImageView(c);
hr.setBackgroundColor(Color.parseColor("#6698fd"));
hr.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 4));
this.addView(hr);
//内容
contentView = new LinearLayout(c);
this.addView(contentView);
//底部按钮布局
LinearLayout bLayout = (LinearLayout)inflater.inflate(R.layout.dialog_button, null);
ok = (TextView) bLayout.findViewById(R.id.dlg_ok);
ok.setVisibility(View.GONE);
cancel = (TextView) bLayout.findViewById(R.id.dlg_cancel);
cancel.setVisibility(View.GONE);
img = (ImageView) bLayout.findViewById(R.id.dlg_img);
img.setVisibility(View.GONE);
this.addView(bLayout);
}
public void setMessage(int res) {
setMessage().setText(res);
}
public void setMessage(String text) {
setMessage().setText(text);
}
public void setMessage(CharSequence ch) {
setMessage().setText(ch);
}
/**
* 单条消息
*/
private TextView setMessage() {
LinearLayout layout = new LinearLayout(mContext);
layout.setOrientation(LinearLayout.HORIZONTAL);
layout.setGravity(Gravity.CENTER_VERTICAL);
TextView tv = new TextView(mContext);
tv.setPadding(5, 10, 10, 10);
layout.addView(tv);
addContentView(layout);
return tv;
}
/**
* 确定按钮的监听事件
* @param listener
*/
public void setOkListener(OnClickListener listener) {
ok.setVisibility(View.VISIBLE);
ok.setOnClickListener(listener);
updateImage();
}
/**
* 取消按钮的监听事件
* @param listener
*/
public void setCancelListener(OnClickListener listener) {
cancel.setVisibility(View.VISIBLE);
cancel.setOnClickListener(listener);
updateImage();
}
private void updateImage() {
if (ok.getVisibility() == cancel.getVisibility() && ok.getVisibility() == View.VISIBLE) {
img.setVisibility(View.VISIBLE);
}
}
public void setIcon(int res) {
Drawable d = getResources().getDrawable(res);
setIcon(d);
}
/**
* 设置标题图片
* @param d
*/
public void setIcon(Drawable d) {
int width = d.getIntrinsicWidth();
int height = d.getIntrinsicHeight();
boolean flag = width > height;
int value;
//判断图片是否超过设定大小
if (WIDTH < (value = flag ? width : height)) {
Matrix m = new Matrix();
float degrees = (float)WIDTH / (float)value;
m.postScale(degrees, degrees);
Bitmap bmp = ((BitmapDrawable)d).getBitmap();
bmp = Bitmap.createBitmap(bmp, 0, 0, width, height, m, true);
d = new BitmapDrawable(bmp);
}
this.icon.setImageDrawable(d);
}
public TextView getTitle() {
return title;
}
public void setTitle(String text) {
this.title.setText(text);
}
public void setTitle(CharSequence ch) {
this.title.setText(ch);
}
public void setTitle(int res) {
this.title.setText(res);
}
public LinearLayout getContentView() {
return contentView;
}
public void setContentView(LinearLayout contentView) {
this.contentView = contentView;
}
public void addContentView(View view) {
this.contentView.addView(view);
}
public void addContentView(int res) {
this.contentView.addView(inflater.inflate(res, null));
}
}
MyDialog:
public class MyDialog extends Activity implements OnClickListener{
public static final int BTN1 = R.id.btn1;
public static final int BTN2 = R.id.btn2;
public static final int BTN3 = R.id.btn3;
public static final int BTN4 = R.id.btn4;
private Button mBtn1, mBtn2, mBtn3, mBtn4;
private Dialog mDialog;
private DialogView mDialogView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
mDialog = new Dialog(this, R.style.FullHeightDialog);
}
private void init() {
mBtn1 = (Button) findViewById(BTN1);
mBtn2 = (Button) findViewById(BTN2);
mBtn3 = (Button) findViewById(BTN3);
mBtn4 = (Button) findViewById(BTN4);
mBtn1.setOnClickListener(this);
mBtn2.setOnClickListener(this);
mBtn3.setOnClickListener(this);
mBtn4.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch(id) {
case BTN1:
showDialogByValue(BTN1);
break;
case BTN2:
showDialogByValue(BTN2);
break;
case BTN3:
showDialogByValue(BTN3);
break;
case BTN4:
showDialogByValue(BTN4);
break;
}
}
private void showDialogByValue(int value) {
mDialogView = new DialogView(this);
mDialogView.setTitle(getString(R.string.title_text));
mDialogView.setIcon(R.drawable.ic_refresh_holo_dark);
switch(value) {
case BTN1:
mDialogView.setMessage(getString(R.string.message_text));
break;
case BTN2:
mDialogView.setMessage(getString(R.string.message_text));
mDialogView.setOkListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MyDialog.this, getString(R.string.dlg_ok), Toast.LENGTH_LONG).show();
mDialog.dismiss();
}
});
break;
case BTN3:
mDialogView.setMessage(getString(R.string.message_text));
mDialogView.setOkListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MyDialog.this, getString(R.string.dlg_ok), Toast.LENGTH_LONG).show();
mDialog.dismiss();
}
});
mDialogView.setCancelListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MyDialog.this, getString(R.string.dlg_cancel), Toast.LENGTH_LONG).show();
mDialog.dismiss();
}
});
break;
case BTN4:
ListView lv = new ListView(this);
ArrayList<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
for (int i = 0; i < 10; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("key", "num " + i);
list.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_1,
new String[]{"key"}, new int[]{android.R.id.text1});
lv.setAdapter(adapter);
mDialogView.addContentView(lv);
break;
}
mDialog.setContentView(mDialogView);
mDialog.show();
}
}
FullHeightDialog:
<resources>
<style name="FullHeightDialog"
parent="android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item><!--边框-->
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@drawable/filled_box</item> <!-- -->
</style>
</resources>