今天我要写的是重写Dialog,让Dialog成为类似于数字键盘,可以输入数字,我顺便还写了个“正在保存......”的对话框。好了,话不多说,先看效果图:
由图就可以知道,程序的效果,下面来看看程序代码:
重写Dialog的NewDialog.java代码:
package com.android.newDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class NewDialog extends Dialog {
public NewDialog(Context context, int theme) {
super(context, theme);
// TODO Auto-generated constructor stub
}
/**
* @author Jasonzhou
* @param context
* NewDialog的上下文
* @param theme
* NewDialog的显示主题,比如可以是noTitile等
* @param view
* NewDialog的view
*/
public NewDialog(Context context, int theme, View view) {
super(context, theme);
setContentView(view);
Window wi = getWindow();
WindowManager.LayoutParams params = wi.getAttributes();
params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
}
/**
* @author Jasonzhou
* @param context
* NewDialog的上下文
* @param theme
* NewDialog的显示主题,比如可以是noTitile等
* @param view
* NewDialog的view
* @param width
* NewDialog的宽度
* @param height
* NewDialog的高度
*/
public NewDialog(Context context, int theme, int view, int width,
int height) {
super(context, theme);
setContentView(view);
// set window params
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
// set width,height by density and gravity
float density = getDensity(context);
params.width = (int) (width * density);
params.height = (int) (height * density);
params.gravity = Gravity.CENTER ;
window.setAttributes(params);
}
private float getDensity(Context context) {
Resources resources = context.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
return dm.density;
}
}
显示第一张图片效果的代码:NewDialogActivity.java
package com.android.newDialog;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class NewDialogActivity extends Activity implements OnClickListener {
private Button bt;
private EditText et;
private String income = "";
private String pay = "";
private View keypadView;
NewDialog dialog;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initialWidget();
dialog = new NewDialog(NewDialogActivity.this, R.style.Theme_dialog,
keypadView);
dialog.setTitle("www");
bt = (Button) findViewById(R.id.button1);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialog.show();
}
});
}
private void initialWidget() {
LayoutInflater li = LayoutInflater.from(NewDialogActivity.this);
keypadView = li.inflate(R.layout.keyboard_digit, null);
keypadView.findViewById(R.id.zero).setOnClickListener(this);
keypadView.findViewById(R.id.one).setOnClickListener(this);
keypadView.findViewById(R.id.two).setOnClickListener(this);
keypadView.findViewById(R.id.three).setOnClickListener(this);
keypadView.findViewById(R.id.four).setOnClickListener(this);
keypadView.findViewById(R.id.five).setOnClickListener(this);
keypadView.findViewById(R.id.six).setOnClickListener(this);
keypadView.findViewById(R.id.seven).setOnClickListener(this);
keypadView.findViewById(R.id.eight).setOnClickListener(this);
keypadView.findViewById(R.id.nine).setOnClickListener(this);
keypadView.findViewById(R.id.point).setOnClickListener(this);
keypadView.findViewById(R.id.delete).setOnClickListener(this);
keypadView.findViewById(R.id.cancel).setOnClickListener(this);
keypadView.findViewById(R.id.clean).setOnClickListener(this);
keypadView.findViewById(R.id.done).setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.zero:
onKeypadPressed("0");
break;
case R.id.one:
onKeypadPressed("1");
break;
case R.id.two:
onKeypadPressed("2");
break;
case R.id.three:
onKeypadPressed("3");
break;
case R.id.four:
onKeypadPressed("4");
break;
case R.id.five:
onKeypadPressed("5");
break;
case R.id.six:
onKeypadPressed("6");
break;
case R.id.seven:
onKeypadPressed("7");
break;
case R.id.eight:
onKeypadPressed("8");
break;
case R.id.nine:
onKeypadPressed("9");
break;
case R.id.point:
onKeypadPressed(".");
break;
case R.id.delete:
onKeypadPressed("delete");
break;
case R.id.cancel:
onKeypadPressed("cancel");
break;
case R.id.clean:
onKeypadPressed("clean");
break;
case R.id.done:
onKeypadPressed("done");
break;
default:
break;
}
}
private void onKeypadPressed(String str) {
if (str.equals("delete")) {// 单击的是回退键
income = income.substring(0, income.length() - 1);
} else if (str.equals("clean")) {// 单击的是清除键
income = "";
bt.setText("0");
} else if (str.equals("done")) {// 单击的是完成键
if (income.equals("") || income.equals("0")) {
Toast.makeText(NewDialogActivity.this, "请输入金额",
Toast.LENGTH_SHORT).show();
}
dialog.dismiss();
} else if (str.equals("cancel")) {// 单击的是取消键
dialog.dismiss();
} else {// 按的是数字键
if (income.equals("0")) {
income = str;
} else {
income = income + str;
}
bt.setText(income);
}
}
}
显示第二张图片效果的代码:Dialog02.java
package com.android.newDialog;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class Dialog02 extends Activity {
private Button back;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog02_01);
NewDialog dialog2 = new NewDialog(this, R.style.Theme_dialog, R.layout.dialog02_02, 180, 120);
dialog2.show();// 显示Dialog
// 如果要修改Dialog中的某个View,比如把"正在删除..."改为"加载中..."
TextView mMessage = (TextView) dialog2.findViewById(R.id.dialog02Tv);
mMessage.setText("正在保存...");
}
}
下面我们来看看styles.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="keypad_btn">
<item name="android:textSize">40.0dip</item>
<item name="android:textColor">#000000</item>
<item name="android:focusable">true</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginTop">2.0dip</item>
<item name="android:layout_weight">1.0</item>
</style>
<style name="keypad_row_ly_hdip">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_weight">1.0</item>
</style>
<style name="keypad_digit_btn" parent="@style/keypad_btn">
<item name="android:background">@drawable/digit_pressed</item>
</style>
<style name="keypad_clean_btn">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@drawable/clean_pressed</item>
<item name="android:layout_weight">1.0</item>
</style>
<style name="keypad_cancel_btn">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@drawable/cancel_pressed</item>
<item name="android:layout_weight">1.0</item>
</style>
<style name="keypad_done_btn">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:background">@drawable/done_pressed</item>
<item name="android:layout_weight">1.0</item>
</style>
<style name="keypad_delete_btn" parent="@style/keypad_btn">
<item name="android:background">@drawable/delete_pressed</item>
</style>
<!-- 重写了Dialog,定义NewDialog的样式为NoTitle -->
<style name="Theme_dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
其实这里最主要的还是重写Dialog的那个类,附上代码下载的地址:android中重写Dialog
各位网友可以发挥想象,定义出不一样的风格。