IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【Android】记录一次输入法位置修改思路 -> 正文阅读

[移动开发]【Android】记录一次输入法位置修改思路

输入法是dialog,还是全屏dialog,且不会被dismiss,显示与隐藏系统调用方法为showWindow(true)和hide(),以下是输入法Window创建,SoftInputWindow继承Dialog,这个不必多说,

mWindow =?new?SoftInputWindow(this,?"InputMethod", mTheme,?null,?null, mDispatcherState,
????????????????WindowManager.LayoutParams.TYPE_INPUT_METHOD, Gravity.BOTTOM,?false);
????????mWindow.getWindow().getAttributes().setFitInsetsTypes(statusBars() | navigationBars());
????????mWindow.getWindow().getAttributes().setFitInsetsSides(Side.all() & ~Side.BOTTOM);
????????mWindow.getWindow().getAttributes().setFitInsetsIgnoringVisibility(true);

至于全屏的依据,可以看SoftInputWindow initDockWindow方法,

看,写入了WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

这个Flag啥意思呢?就是将窗口放置在整个屏幕内,忽略父容器的限制,

private?void?initDockWindow() {

???????WindowManager.LayoutParams lp = getWindow().getAttributes();

???????lp.type = mWindowType;
???????lp.setTitle(mName);

???????lp.gravity = mGravity;
???????updateWidthHeight(lp);

???????getWindow().setAttributes(lp);

???????int?windowSetFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
???????int?windowModFlags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
???????????????WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
???????????????WindowManager.LayoutParams.FLAG_DIM_BEHIND;

???????if?(!mTakesFocus) {
???????????windowSetFlags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
???????}?else?{
???????????windowSetFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
???????????windowModFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
???????}
???????getWindow().setFlags(windowSetFlags, windowModFlags);
???}


如果要输入法上移,必须调整dialog中的布局,

在InputMethodService方法中,initView如下,

mWindow.setContentView(mRootView),关键,

mWindow是SoftInputWindow,继承Dialog,因此这是设置视角;

如何,一些成员的初始化在此进行,如mInputFrame和mCandidatesFrame,这是啥呢?在setInputView中回调onCreateView方法,拿到三方输入法自定义的View,

所以显示在我们面前的视野就是mInputFrame;

void?initViews() {

???????mInitialized =?false;
???????mViewsCreated =?false;
???????mShowInputRequested =?false;
???????mShowInputFlags =

?0;
???????mThemeAttrs = obtainStyledAttributes(android.R.styleable.InputMethodService);
???????mRootView = mInflater.inflate(
???????????????com.android.internal.R.layout.input_method,?null);
???????mWindow.setContentView(mRootView);
???????mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener(mInsetsComputer);
???????mRootView.getViewTreeObserver().addOnComputeInternalInsetsListener(mInsetsComputer);
???????if?(Settings.Global.getInt(getContentResolver(),
???????????????Settings.Global.FANCY_IME_ANIMATIONS,?0) !=?0) {
???????????mWindow.getWindow().setWindowAnimations(
???????????????????com.android.internal.R.style.Animation_InputMethodFancy);
???????}
???????mFullscreenArea = mRootView.findViewById(com.android.internal.R.id.fullscreenArea);
???????mExtractViewHidden =?false;
???????mExtractFrame = mRootView.findViewById(android.R.id.extractArea);
???????mExtractView =?null;
???????mExtractEditText =?null;
???????mExtractAccessories =?null;
???????mExtractAction =?null;
???????mFullscreenApplied =?false;
???????mCandidatesFrame = mRootView.findViewById(android.R.id.candidatesArea);
???????mInputFrame = mRootView.findViewById(android.R.id.inputArea);
???????mInputView =?null;
???????mIsInputViewShown =?false;
???????mExtractFrame.setVisibility(View.GONE);
???????mCandidatesVisibility = getCandidatesHiddenVisibility();
???????mCandidatesFrame.setVisibility(mCandidatesVisibility);
???????mInputFrame.setVisibility(View.GONE);
???}

因为要上移输入法,尝试对window的attribute参数下手,失败告终,因为设置y参数对全屏输入法无效,由于service的onCreate方法new SoftInputWindow时,传入Gravity和Bottom,输入法就默认显示底部?调试时改为Top,依然显示在底部,比较费解。

FullscreenArea = mRootView.findViewById(com.android.internal.R.id.fullscreenArea);具体资源看不到,这个应该覆盖了整个屏幕

综上所述,输入法类似以下布局,暂不讨论屏幕旋转之内,这个在SoftInputWindow会更新Gravity,

处理上移问题,就要上移mInputFrame,

怎么移?mInputFrame本身是Framelayout,而且位置在android资源文件中写死了,通过代码动态移动?

想过WindowManager的updateLayout,可是布局参数呢?

或者直接调用setY,可问题是这样的效果类似动画,原View并没有移动,也就导致点击事件不可用,

或者view的startMoveTask方法?感觉都不行,

一般三方自定义输入法时,需要继承InputMethodService类,这是个标准,

重写其中onCreateVIew方法,也就传入自定义输入法布局,系统通过如下方法回调,

public?void?updateInputViewShown() {
???????boolean?isShown = mShowInputRequested && onEvaluateInputViewShown();
???????if?(mIsInputViewShown != isShown && mDecorViewVisible) {
???????????mIsInputViewShown = isShown;
???????????mInputFrame.setVisibility(isShown ? View.VISIBLE : View.GONE);
???????????if?(mInputView ==?null) {
???????????????initialize();
???????????????View v = onCreateInputView();
???????????????if?(v !=?null) {
???????????????????setInputView(v);
???????????????}
???????????}
???????}
???}

之后,通过setInputView方法设置显示在用户面前的视野,可以看到,视野添加到mInputFrame中,对于另外一个方法setCandidatesView,就是候选视图,暂不多说,候选嘛。

public?void?setInputView(View view) {
???????mInputFrame.removeAllViews();
???????mInputFrame.addView(view,?new?FrameLayout.LayoutParams(
???????????????ViewGroup.LayoutParams.MATCH_PARENT,
???????????????ViewGroup.LayoutParams.WRAP_CONTENT));
???????mInputView = view;
???}

所以我们要挪动输入法,可以在这里做文章,即添加一点参数,让mInputView上移一点,

FrameLayout.LayoutParams提供了bottomMargin参数,即让咱们的mInputView相对bottom移动一点距离,单位是像素不是dp,

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:49:24  更:2021-11-11 12:50:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:03:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码