Programmation Android : la boîte de dialogue qui apparaît en bas
Lien du blog de cet article:http://blog.csdn.net/jdh99 , auteur: jdh, réimpression veuillez préciser.
alentours:
Hôte: WIN10
Environnement de développement: Android Studio 2.2 Preview 3
La description:
La boîte de dialogue qui apparaît en bas est implémentée dans "Programmation Android: La boîte de dialogue qui apparaît en bas " . Sur cette base, une boîte d'entrée universelle est réalisée, et l'effet est montré dans la figure ci-dessous. Dans la classe de boîte de saisie, l'activité est notifiée via le mécanisme de rappel, réalisant ainsi le découplage de l'activité et de la boîte de dialogue.
Fichier de mise en page 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>
Code source:
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();
}
}
initialisation:
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;
}
affichage:
addFriendDialog.show(getFragmentManager(), "");