重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

android输入框,Android输入框样式

Android 输入法窗口焦点获取流程(2) ,输入法窗口和应用窗口绑定

基于Android9.x

成都创新互联是专业的大竹网站建设公司,大竹接单;提供成都网站制作、做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行大竹网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

Window和Session创建成功后,窗口的下一步流程为获取焦点

我们看下焦点获取过程,跟输入法相关的流程

两个Activity切换时,对应的状态变化过程为:

以下是Activity窗口初次获取焦点的流程

当两个activity 切换时,失去焦点的窗口调用过程如下:

对应的,获取焦点的额窗口的调用过程如下:

当B窗口的状态切换到RESUMED时,当窗口的focus可能变化时,会调用updateFocusedWindowLocked

在该方法中,判断,如果还没有执行startInputInner方法,则执行startInputInner方法,否则,直接执行startInputOrWindowGainedFocus方法

主要流程:

1:设置controlFlags的flag为CONTROL_WINDOW_FIRST

2:检查是否已经执行过startInputInner,没有的话执行startInputInner--startInputOrWindowGainedFocus;否则,直接执行startInputOrWindowGainedFocus

两条路径,携带的startInputReason参数不一样

主要流程:

1:检查要启动和退出的ServedView是否为同一个,如果为同一个,则表示已经执行过startInputInner,则返回false,表示不再执行startInputInner

2:如果获取焦点的是EditorText,会创建跟IMS通信的mServedInputConnectionWrapper对象

主要流程:

1:创建EditorInfo对象tba,这个参数对TextView布局才有意义,它的初始化是在mServedView的onCreateInputConnection完成实例化的

2:根据EditorInfo创建一个InputConnection对象,输入法应用通过该对象,完成输入内容到输入框的传递;ACTIVITY获取焦点场景,该对象

为null,因为没有要输入的对象

startInputOrWindowGainedFocus携带的参数

startInputReason = 1

表示,该流程是窗口获取焦点过程

mClient

应用层创建的IInputMethodClient对象,为服务层提供应用层的各个回调方法

该方法跟应用进程首次创建时Session时,传递到IMMS的对象是同一个对象

windowGainingFocus:

应用层的ViewRootImpl$W对象

controlFlags |= CONTROL_START_INITIAL;

表示window窗口刚开始获取焦点

softInputMode = SOFT_INPUT_ADJUST_RESIZE , 允许调整输入法窗口,避免被其他窗口遮挡

tba , EditorInfo对象

servedContext

null

missingMethodFlags

ic等于null的情况下,为0

当应用层传递的W对象windowToken不为null的时候,则创建windowGainedFocus对象,返回给app

结果返回后,会对IMM的对象进行赋值

如此,进入一个窗口,获取窗口焦点过程,窗口与输入法相关的流程,就结束了。

下一篇:输入法在输入框弹出流程

Android输入法(3),弹出流程

Android WebView加载页面的输入框被软键盘遮挡的问题

当实现沉浸式状态栏时遇到软件盘遮挡WebView页面的输入框的问题,这是实现方式有问题,应该检查你的实现方式。

1)加载WebView的Activty不能设置为全屏模式,即Theme.NoTitleBar.Fullscreen,可以使用Theme.Holo.Light.NoActionBar

2)沉浸式状态栏的实现方式,在Activity的根布局里加两个属性:

android:clipToPadding="true" 设置你的绘制区域在padding里面

android:fitsSystemWindows="true" 调整view的padding属性为系统窗口 留出空间

在Activity的onCreate方法里面设置标题栏为透明,即:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_ST ATUS);

3)Activity里面不能设置android:windowSoftInputMode的属性,使用默认的属性即可

以上3步即可实现沉浸式状态栏并且能保证你的WebView加载的HTML页面的输入框不被软键盘遮挡。

上一篇 Android Studio在SVN上创建分支

下一篇 Android Converty问题解决方案

相关文章推荐

• android中webview加载html输入框不能输入内容问题记录

• 如何解决Android软键盘盖住输入框的问题

• Android 软键盘盖住输入框的问题

• Android 软键盘盖住输入框的问题

• Android 软键盘盖住输入框的问题

• Android 软键盘盖住输入框的问题

• Android 软键盘盖住输入框的问题

• android popupwindow 中输入框被软键盘弹出挡住问题解决

• ios解决软键盘遮挡输入框问题

• Android软键盘遮挡输入框解决方法

参考知识库

Android知识库

34080 关注 | 2937 收录

猜你在找

Android中的五大布局

零基础学软件之HTML语言

【Android APP开发】Android高级商业布局快速实现

html5的app开发

Android前沿技术—《软件框架搭建》

Android移植基础

html系统学习篇

零基础学习HTML5—html+css基础

Android开发之初窥门径

Android之数据存储

关闭

Android dialog 遮住输入框的解决思路

在工作中经常会遇到弹出的dialog有输入框的情况,屏幕大了还好,屏幕小了之后就特别容易出现输入框被软键盘遮住的情况,下面就是我在实际想中中遇到的

从上图可以看出输入框已经看不到了,遇到这种情况的第一个思路都是在dialog的style中添加

item name="android:windowSoftInputMode"adjustPan/item,我也试了下基本上没用。然后换了个思路,既然软键盘弹出来了,为什么不能让dialog向上移动同样的距离呢。思路有了,下面就是把他实现了。

首先就是要计算软键盘的高度,由于google并没有给出具体的方法来计算软键盘的高度,这时候我们就只能根据布局的高度变化来计算了。首先需要计算出屏幕的bottom坐标,然后监控布局的变动判断变动后的bottom和初始的bottom的差值,一般肉眼观察软键盘的高度差不多是屏幕高度的1/3,所以就假设bottom往上移动了屏幕的1/3的距离就认为软件盘弹出来了,当然也可以根据其他值来判断,下面贴出具体方法:

/**

* activity中判断软键盘是否显示

* @param activity

* */

fun isKeyboardShowing(activity: Activity): Boolean {

val screenHeight = activity.window!!.decorView.height.toDouble()

//获取view的可见区域

val rect = Rect()

activity.window!!.decorView.getWindowVisibleDisplayFrame(rect)

return (2.0 /3.0) * screenHeight rect.bottom.toDouble()

}

接下来我们来计算出软件盘的高度,经过我在多个测试机上实验发现初始时bottom就是屏幕的高度,下面是计算键盘高度的具体方法

/**

* activity中计算软键盘的高度

* @param activity

* */

fun getKeyboardHeight(activity: Activity): Int {

val displayMetrics = DisplayMetrics()

activity.windowManager.defaultDisplay.getMetrics(displayMetrics)

val screenHeight = displayMetrics.heightPixels

val rect = Rect()

activity.window!!.decorView.getWindowVisibleDisplayFrame(rect)

return screenHeight - rect.bottom

}

有了高度之后一切就好办了我们只需要在软键盘弹出来的时候把dialog往上移动就行,在移动方式上我选择了设置LayoutParams的方式,开始时想设置底部margin的,结果发现没作用,dialog一点不移动,最后只好设置上边的margin为负值

if (SoftUtils.isKeyboardShowing(context)) {

val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams

if (lp.topMargin ==0) {

lp.topMargin = -SoftUtils.getKeyboardHeight(context)

if (mRootView.height

lp.height =mRootOriginHeight

    }

mRootView.layoutParams = lp

}

}else {

if (mRootOriginHeight ==0) {

mRootOriginHeight =mRootView.height

}

val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams

if (lp.topMargin 0) {

lp.topMargin =0

    mRootView.layoutParams = lp

}

}

其中mRootView是dialog最外层的布局。在这里面比较重要的一点监测方式,在哪里监测软键盘的弹出动作,在activity中可以监测onWindowFocusChanged方法,但是如果封装了dialog的话,dialog中的onWindowFocusChanged并不会起作用,在这里我选择了使用ViewTreeObserver和监听,通过给mRootView的ViewTreeObserver添加addOnGlobalLayoutListener来实时判断,下面是完整的方法

private fun setSpace() {

val treeObserver =mRootView.viewTreeObserver

treeObserver.addOnGlobalLayoutListener{

    if (SoftUtils.isKeyboardShowing(context)) {

val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams

if (lp.topMargin ==0) {

lp.topMargin = -SoftUtils.getKeyboardHeight(context)

if (mRootView.height

lp.height =mRootOriginHeight

            }

mRootView.layoutParams = lp

}

}else {

if (mRootOriginHeight ==0) {

mRootOriginHeight =mRootView.height

        }

val lp =mRootView.layoutParams as ViewGroup.MarginLayoutParams

if (lp.topMargin 0) {

lp.topMargin =0

            mRootView.layoutParams = lp

}

}

}

}

在这里当软键盘弹出的时候重新设置了下dialog的高度,因为有时候软键盘的弹出会使dialog的高度压缩,所以弹出的时候重新设置下就好了。

这就是我的一个解决思路,当然完全按这个写的话当输入框较多时也可能出问题,最上层的输入框跑屏幕之外去了,这种情况下我们只需要根据输入框的位置动态的计算dialog需要往上移动的距离就行,不要一直设置为计算出来的软键盘的高度。

下图是解决之后的UI

『Android』一个简单易用的验证码输入框(6位)

  之前开发中验证码输入的时候,找了各种各样的验证码输入框,各种奇葩= =,最近抽空写了一个,正好熟悉一下自定义控件。

github 地址:

之前在看其他人的之前方式,大概有以下几类:

  我使用的就是最后一种:后边使用一个 EditText 接收输入内容,在页面上放置多个 TextView 展示输入框中输入的内容。

null

在根目录 build.build中加入:

添加依赖:

因为其中显示的光标我使用的是动图,所以还需要引入 glide 的依赖:

xml文件中:

a 下边线样式:

xml文件内容:

b 四周都有框样式:

xml文件内容:

建议使用 gif 图片,在控件中可以设置光标的高度,光标在输入框中上下居中。效果图片:

有需要的功能或者使用中遇到问题,可以留言或者发邮件给我:

邮箱: ymwmlxl@gmail.com

Android 点击输入框弹出键盘,布局随键盘往上移动

一、效果图:

二、Code:

/**

*  1、获取main在窗体的可视区域

*  2、获取main在窗体的不可视区域高度

*  3、判断不可视区域高度,之前根据经验值,在有些手机上有点不大准,现改成屏幕整体高度的1/3

*      1、大于屏幕整体高度的1/3:键盘显示  获取Scroll的窗体坐标

*                          算出main需要滚动的高度,使scroll显示。

*      2、小于屏幕整体高度的1/3:键盘隐藏

*

* @param main 根布局 

* @param scroll 需要显示的最下方View

*/

public static void addLayoutListener(final View main, final View scroll) {

main.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

    @Override

    public void onGlobalLayout() {

        Rect rect = new Rect();

        main.getWindowVisibleDisplayFrame(rect);

        int screenHeight = main.getRootView().getHeight();

        int mainInvisibleHeight = main.getRootView().getHeight() - rect.bottom;

        if (mainInvisibleHeight screenHeight / 4) {

            int[] location = new int[2];

            scroll.getLocationInWindow(location);

            int srollHeight = (location[1] + scroll.getHeight()) - rect.bottom;

            main.scrollTo(0, srollHeight);

        } else {

            main.scrollTo(0, 0);

}

}

});

}

三、调用方式:

在Activity的onCreate()中调用,

仅此记录。

android 弹出输入框并得到输入框的结果?

不用找了,这才是正解。你的需求其实是,需要一个阻塞式对话框,安卓本身所有弹窗都是非阻塞的。

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.widget.EditText;

/**

* 动态获取用户输入后在继续后面的流程

* 这是一个模态阻塞对话框(阻塞主线程,结果不用回调来处理)

*/

public class BlockingInputDialog {

String mInputString = "";

Activity mContext;

String mTitle;

EditText mEditText;

Handler mHandler;

public BlockingInputDialog(Activity context, String title){

mContext = context;

mTitle = title;

}

public String showDialog(){

mHandler = new Handler(){

@Override

public void handleMessage(Message msg) {

//super.handleMessage(msg);

throw new RuntimeException();

}

};

AlertDialog.Builder builder = new AlertDialog.Builder(mContext);

builder.setTitle(mTitle);

builder.setCancelable(false);

mEditText = new EditText(mContext);

builder.setView(mEditText);

builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialogInterface, int i) {

mInputString = mEditText.getText().toString();

Message message = mHandler.obtainMessage();

mHandler.sendMessage(message);

}

});

builder.setNegativeButton("取消", null);

builder.create().show();

try {

Looper.getMainLooper().loop();

}

catch(RuntimeException e2)

{

}

return mInputString;

}

}


分享名称:android输入框,Android输入框样式
文章地址:http://cqcxhl.com/article/dsdgics.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP