Android programming: the dialog box that pops up at the bottom
This article blog link:http://blog.csdn.net/jdh99 , author: jdh, reprint please specify.
surroundings:
Host: WIN10
Development environment: Android Studio 2.2 Preview 3
Description:
The dialog box that pops up at the bottom is implemented in "Android Programming: The dialog box that pops up at the bottom. On this basis, a universal input box is realized, and the effect is shown in the figure below. In the input box class, the activity is notified through the callback mechanism, thereby realizing the decoupling of the activity and the dialog box.
Effect picture:
Layout file dialog_input.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:text="标题"/>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TextInputEditText
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:singleLine="true" />
</android.support.design.widget.TextInputLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingBottom="16dp">
<Button
android:id="@+id/cancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:text="取消" />
<Button
android:id="@+id/ok"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:text="确定" />
</LinearLayout>
</LinearLayout>
Source code:
InputDialogInterface.class:
package com.bazhangkeji.classroom.common;
public interface InputDialogInterface {
void onClick();
FilterResult filter(String inputText);
class FilterResult {
public boolean result;
// 错误提示.result为false时有效
public String errorHint = "";
}
}
InputDialog.class:
package com.bazhangkeji.classroom.common;
import android.app.Dialog;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.TextInputEditText;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.bazhangkeji.classroom.R;
import com.bazhangkeji.classroom.database.DBPersonalInfo;
import com.bazhangkeji.classroom.database.PersonalInfo;
import com.bazhangkeji.classroom.session.VideoSessionActivity;
import com.bazhangkeji.classroom.session.VoiceSessionActivity;
import com.jakewharton.rxbinding2.view.RxView;
import com.trello.rxlifecycle2.android.ActivityEvent;
import com.trello.rxlifecycle2.android.FragmentEvent;
import com.trello.rxlifecycle2.components.RxDialogFragment;
import java.util.concurrent.TimeUnit;
public class InputDialog extends RxDialogFragment {
private Dialog dialog;
private InputDialogInterface observer;
private String title;
private String hint;
private TextInputEditText editTextInput;
/**
* 初始化.必须调用一次
* @param title: 标题
* @param hint: 提示
* @param observer: 观察者对象
*/
public void init(String title, String hint, InputDialogInterface observer) {
this.title = title;
this.hint = hint;
this.observer = observer;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
dialog = new Dialog(getActivity(), R.style.DialogPopBottom);
View inflate = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_input, null);
dialog.setContentView(inflate);
dialog.setCanceledOnTouchOutside(true);
Window window = dialog.getWindow();
WindowManager.LayoutParams lp = window.getAttributes();
lp.gravity = Gravity.BOTTOM;
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(lp);
TextView textViewTitle = (TextView) inflate.findViewById(R.id.title);
Button buttonCancel = (Button) inflate.findViewById(R.id.cancel);
Button buttonOK = (Button) inflate.findViewById(R.id.ok);
editTextInput = (TextInputEditText) inflate.findViewById(R.id.input);
textViewTitle.setText(title);
editTextInput.setHint(hint);
RxView.clicks(buttonCancel)
.throttleFirst(1, TimeUnit.SECONDS)
.compose(this.bindUntilEvent(FragmentEvent.DESTROY))
.subscribe(v -> dialog.cancel());
RxView.clicks(buttonOK)
.throttleFirst(1, TimeUnit.SECONDS)
.compose(this.bindUntilEvent(FragmentEvent.DESTROY))
.subscribe(v -> {
InputDialogInterface.FilterResult filterResult = observer.filter(editTextInput.getText().toString());
if (filterResult == null || filterResult.result) {
dialog.cancel();
observer.onClick();
} else {
editTextInput.setError(filterResult.errorHint);
editTextInput.requestFocus();
}
});
return dialog;
}
/**
* 得到输入内容
* @return 输入内容
*/
public String getInput() {
return editTextInput.getText().toString();
}
}
initialization:
private InputDialog addFriendDialog = new InputDialog();
addFriendDialog.init("搜索好友", "请输入用户id", new InputDialogInterface() {
@Override
public void onClick() {
Logging.e("click!!!" + addFriendDialog.getInput());
}
@Override
public FilterResult filter(String inputText) {
return isInputValid(inputText);
}
});
private InputDialogInterface.FilterResult isInputValid(String inputText) {
InputDialogInterface.FilterResult filterResult = new InputDialogInterface.FilterResult();
if (TextUtils.isEmpty(inputText)) {
filterResult.result = false;
filterResult.errorHint = "请输入用户号";
} else if (isContainIllegalChar(inputText)) {
filterResult.result = false;
filterResult.errorHint = "用户号不能包含中文空格等字符";
} else if (inputText.length() < 5 || inputText.length() > 20) {
filterResult.result = false;
filterResult.errorHint = "用户号长度需要5";
} else if (inputText.startsWith("g")) {
filterResult.result = false;
filterResult.errorHint = "用户号不能以g开头";
} else {
filterResult.result = true;
}
return filterResult;
}
private boolean isContainIllegalChar(String str) {
char[] ch = str.toCharArray();
for (char c : ch) {
if (c <= 0x20 || c >= 0x7f) {
return true;
}
}
return false;
}
display:
addFriendDialog.show(getFragmentManager(), "");