Android编程:底部弹出输入框

Android编程:底部弹出的对话框


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.


环境:

主机:WIN10

开发环境:Android Studio 2.2 Preview 3


说明:

《Android编程:底部弹出的对话框》中实现了底部弹出的对话框。在此基础上实现通用的输入框,效果如下图所示。输入框类中通过回调机制通知活动,从而实现了活动与对话框的解耦。



效果图:



布局文件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>


源代码:

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();
    }
}


 初始化:

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;
    }


显示:

addFriendDialog.show(getFragmentManager(), "");



  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用AlertDialog来实现: 1. 首先在布局文件中定义一个EditText和一个Button,用于触发弹出输入框的事件。 ```xml <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="弹出输入框" /> ``` 2. 在Activity中定义一个AlertDialog,设置标题和输入框,并给确定按钮设置点击事件。点击确定按钮后,获取输入框中的文本内容,并进行逻辑处理。 ```java EditText editText = findViewById(R.id.editText); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("请输入内容"); // 定义一个EditText用于输入文本内容 final EditText input = new EditText(MainActivity.this); input.setInputType(InputType.TYPE_CLASS_TEXT); builder.setView(input); // 给确定按钮设置点击事件 builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String text = input.getText().toString(); // 进行逻辑处理 // ... } }); // 给取消按钮设置点击事件 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); builder.show(); } }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值