开发中常用的各种自定义控件(一)自定义样式对话框
暂时分三种:
1)固定对话框标题栏与下部两个按钮,自定义内容区域
2)固定对话框标题栏,自定义内容区域与按钮区域
3)完全自定义对话框UI
因为是常用,所以只放通用的前两种,下面举个例子:
暂时分三种:
1)固定对话框标题栏与下部两个按钮,自定义内容区域
2)固定对话框标题栏,自定义内容区域与按钮区域
3)完全自定义对话框UI
因为是常用,所以只放通用的前两种,下面举个例子:
a)自定义的工具:
public abstract class DialogBaseViewHolder {
public View itemView;
public DialogBaseViewHolder() {
}
public DialogBaseViewHolder(View itemView) {
this.itemView = itemView;
}
}
public class CustomDialogUtils {
public interface OnCustomDialogListener {
void onClickCancel(String type);
void onClickConfrim(String type);
}
public static final String TYPE_CUSTOM_CLQDJL = "TYPE_CUSTOM_CLQDJL";
public static final String TYPE_CUSTOM_CLQDJL_EDIT = "TYPE_CUSTOM_CLQDJL_EDIT";
private OnCustomDialogListener listener;
private LayoutInflater layoutInflater;
private Context context;
private Dialog dialog;
private View view;
private String type;
public CustomDialogUtils(Context context, OnCustomDialogListener listener) {
this.context = context;
this.listener = listener;
this.layoutInflater = LayoutInflater.from(context);
}
public void setType(String type) {
this.type = type;
}
/**
* 获取自定义View对话框
*/
public void initCustonViewDialog(String title,
DialogBaseViewHolder viewHolder) {
dialog = new Dialog(context, R.style.CustomDialogStyle);
view = layoutInflater.inflate(R.layout.dialog_item_layout_custom, null);
initTitleAndButton(title);
LinearLayout layout = (LinearLayout) view
.findViewById(R.id.dialog_custom_view_layout);
layout.addView(viewHolder.itemView);
dialog.setContentView(view);
}
/** 获取自定义button对话框 */
public void initCustomViewAndButtonDialog(String title,
DialogBaseViewHolder viewHolder) {
initCustonViewDialog(title, viewHolder);
LinearLayout dialog_button_view = (LinearLayout) view
.findViewById(R.id.dialog_button_view);
dialog_button_view.setVisibility(View.GONE);
}
private void initTitleAndButton(String title) {
TextView item_name = (TextView) view.findViewById(R.id.item_name);
item_name.setText(title);
/** 按钮 */
Button cancel = (Button) view.findViewById(R.id.item_cancel);
Button confrim = (Button) view.findViewById(R.id.item_confrim);
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.onClickCancel(type);
}
}
});
confrim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (listener != null) {
listener.onClickConfrim(type);
}
}
});
}
public void show() {
dialog.show();
Window dialogWindow = dialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
DisplayMetrics d = context.getResources().getDisplayMetrics(); // 获取屏幕宽、高用
lp.width = (int) (d.widthPixels * 0.85); // 宽度设置为屏幕的0.8
dialogWindow.setAttributes(lp);
}
public void dissmiss() {
dialog.dismiss();
}
}
b)注意样式的问题:
<style name="CustomDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:backgroundDimAmount">0.6</item>
</style>
c)固定的layout文件:
1)主布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_root_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="@layout/dialog_item_title"
android:layout_width="match_parent"
android:layout_height="50dp" />
<LinearLayout
android:id="@+id/dialog_custom_view_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
<include android:id="@+id/dialog_button_view"
layout="@layout/dialog_item_button"
android:layout_width="match_parent"
android:layout_height="50dp" />
</LinearLayout>
2)标题栏布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_layout"
android:layout_width="match_parent"
android:layout_height="80px"
android:layout_alignParentTop="true"
android:background="#ffff0000"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical">
<TextView
android:id="@+id/item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
3)按钮布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80px"
android:background="#f1f1f1"
android:orientation="horizontal">
<Button
android:id="@+id/item_cancel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/transparent"
android:gravity="center"
android:text="取消"
android:textColor="#666666"
android:textSize="16sp" />
<ImageView
android:layout_width="1px"
android:layout_height="match_parent"
android:background="#999999" />
<Button
android:id="@+id/item_confrim"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/transparent"
android:gravity="center"
android:text="确定"
android:textColor="#666666"
android:textSize="16sp" />
</LinearLayout>
d)实现自定义ViewHolder,继承工具中的DialogBaseViewHoldler:
重点()
super(view);
public class CustomDialogActivity extends AdaptiveActivity {
private CustomDialogUtils utils;
private TestDialogHolder dialogHolder;
private static final String TYPE_01 = "TYPE_01";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom_dialog);
}
public void showDialog(View v) {
utils = new CustomDialogUtils(this, new OnCustomDialogListener() {
@Override
public void onClickConfrim(String type) {
utils.dissmiss();
switch (type) {
case TYPE_01:
break;
}
}
@Override
public void onClickCancel(String type) {
utils.dissmiss();
switch (type) {
case TYPE_01:
break;
}
}
});
dialogHolder = new TestDialogHolder(LayoutInflater.from(this).inflate(
R.layout.dialog_item_custom_01, null));
dialogHolder.textView.setText("1234567654321234567");
utils.initCustonViewDialog("测试对话框", dialogHolder);
/** 区分不同对话框的flag,对应的操作返回分发 */
utils.setType(TYPE_01);
utils.show();
}
class TestDialogHolder extends DialogBaseViewHolder {
public TextView textView;
public TestDialogHolder(View view) {
super(view);
textView = (TextView) view.findViewById(R.id.text);
}
}
}
实现自定义区域的layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center" />
</LinearLayout>