我的视图中有一个EditText小部件.当用户选择EditText小部件时,我会显示一些指令并显示软键盘.
我使用OnEditorActionListener来检测用户何时完成文本输入,然后关闭键盘,隐藏指令并执行某些操作.
我的问题是当用户按下BACK键关闭键盘时.操作系统解除键盘,但我的指令(我需要隐藏)仍然可见.
我已经尝试重写OnKeyDown,但是当使用BACK按钮关闭键盘时,似乎没有调用.
我已经尝试在EditText小部件上设置OnKeyListener,但似乎也没有调用.
如何检测软键盘何时被解除?
是否可以捕获为EditText显示或隐藏软键盘的事件?
我有一个Activity在配置更改(所需)上重新创建的.我有一个在布局中使用单个DialogFragment调用.setRetainInstance(true)EditText
在DialogFragment中,onActivityCreated我打电话给:
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Run Code Online (Sandbox Code Playgroud)
A)如果我打开键盘然后当我将应用程序放入背景然后将其带到foregournd然后我希望键盘仍然显示.
B)如果我关闭键盘(EditText仍有焦点并显示所需行为的光标),那么如果我将应用程序放入背景然后将其带到前台,我希望键盘仍然关闭.
我似乎无法同时实现A)和B).当我将应用程序带到前台时,键盘始终处于关闭状态.我试过.SOFT_INPUT_STATE_ALWAYS_VISIBLE但键盘始终打开.
提前感谢您对我如何实现这一目标的任何建议.我也希望在旋转时保持这种键盘状态,但是我要离开那一天了.彼得.
编辑 请注意,我不希望防止在配置改变而重新创建活动.
我还试验了WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED在手机上旋转时保持键盘打开/关闭状态(单窗格布局)但是a)不适用于双窗格布局b)在将应用程序带到前台时没有保持键盘状态.
我正在尝试监听键盘显示或隐藏时发生的事件.这在Android中可行吗?我不想弄清楚当我开始活动时键盘是显示还是隐藏,我想听听事件.
我注意到Android Market Application,当你点击搜索按钮时,它会显示键盘,但是当你点击back按钮时,搜索EditText变得不可见而且keyboard是隐藏的.问题是我EditText按下后退键后隐藏键盘后无法隐藏,因为我找不到隐藏键盘事件的监听器.我发现这个示例如何在Android中捕获"虚拟键盘显示/隐藏"事件?
但它在软键盘上不起作用.
ImageView键盘出现时如何隐藏(按下某些键盘后EditText).ImageView当键盘被解除时显示这个?
这个答案对WebViews不起作用,这也不适用.所以这个问题专门用于使用WebView时.下面的代码加载带有文本输入字段的网页.单击文本输入字段时,键盘出现.
public class MainActivity extends AppCompatActivity {
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
final WebView webView = (WebView) findViewById(R.id.textFavorites);
BottomNavigationView bottomNavigationView = (BottomNavigationView)
findViewById(R.id.bottom_navigation);
webView.loadUrl("https://www.journaldev.com");
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.action_favorites:
webView.loadUrl("https://www.journaldev.com");
break;
}
return false;
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
activity_main.xml中:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/textFavorites"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="?attr/actionBarSize"/>
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@color/white"
app:itemTextColor="@color/white"
app:menu="@menu/bottom_navigation_main" …Run Code Online (Sandbox Code Playgroud) 我想知道是否有任何方式可以在屏幕键盘显示或消失时由android自动通知。
例如,当我们单击一个编辑文本时,将显示ime。会有活动电话吗?当我们按回去时它消失时,同样会有呼叫吗?
我发现这个线程是Android:屏幕键盘出现时触发哪个事件?,但尚未找到答案。
目的是因为我需要一个事件来自动操纵可见性。我有一个活动,在屏幕顶部,下面有一个edittext,一个listview和一个linearlayout彼此重叠。为了控制用户看到的内容,我操纵可见性。默认情况下,最初显示线性布局,但是,当用户输入文本时,应改为显示列表视图。用户完成键入后,列表视图应消失,在这种情况下,屏幕键盘将关闭。
我尝试使用onFocusChange来完成可见性的更改,但是,即使屏幕键盘消失了,edittext仍然会保持焦点,并且线性布局不会再出现。
下面是我对onFocusChange的实现
@Override
public void onFocusChange(View v, boolean hasFocus)
{
if(v.getId()==R.id.search_screen_keyword_textbox)
{
if(hasFocus)
{
filterSection.setVisibility(View.GONE);
autoComSection.setVisibility(View.VISIBLE);
}
else
{
filterSection.setVisibility(View.VISIBLE);
autoComSection.setVisibility(View.GONE);
}
}
else if(v.getId()==R.id.search_screen_location_textbox)
{
if(hasFocus)
{
filterSection.setVisibility(View.GONE);
autoComSection.setVisibility(View.VISIBLE);
}
else
{
filterSection.setVisibility(View.VISIBLE);
autoComSection.setVisibility(View.GONE);
}
}
else
{
filterSection.setVisibility(View.VISIBLE);
autoComSection.setVisibility(View.GONE);
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人对此有任何想法,请告诉我。:D
有很多关于查找显示/隐藏软键盘事件的帖子。我发现自己处于需要根据片段中的软键状态更改图标的情况。
我尝试实现 onMeasure,但无法在片段中覆盖它。是否有一种(相对)无痛的方法可以在我的片段中获得干净的显示/隐藏软键盘事件,或者我应该放弃发货?
我有一个包含片段的活动,片段包含自定义视图.customview包含一个edittext,并在其下方是一个高度为match_parent的recyclerview.当用户专注于edittext时,会出现一个软输入键盘.不幸的是,这个键盘隐藏了它下面的一半Recyclerview.我希望recyclerview调整大小到屏幕的剩余可见高度(在edittext下),这样列表中的项目不会被键盘隐藏.
我已尝试为清单中的活动设置adjustresize,但它没有效果:
android:windowSoftInputMode="adjustResize"
Run Code Online (Sandbox Code Playgroud)
我已经尝试将我的应用主题设置为基本主题(如果我的自定义主题中的某些内容导致问题) - 没有效果:
android:theme="@style/Theme.AppCompat.NoActionBar"
Run Code Online (Sandbox Code Playgroud)
我已经检查过以确保层次结构中的任何地方都没有框架布局到必须调整大小的视图(我读了一个SO线程,这可能是个问题) - 没有.
我检查了活动,片段,自定义视图和连接的每个适配器,以确保我没有在任何地方调用getWindow(我不是).
自定义视图在运行时从视图存根中膨胀.这有联系吗?
编辑:
父母的内容:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/parent_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
...
<ViewStub
android:id="@+id/viewstub_outername"
android:layout="@layout/viewstub_thatIneed"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
viewstub的内容:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/viewstub_root"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:background="@android:color/white"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="20dp"
android:visibility="invisible"
/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="20dp"
android:visibility="invisible"
/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
这样显示键盘:
public static void showSoftKeyboard(Activity activity) {
View view = activity.getCurrentFocus();
InputMethodManager inputManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
Run Code Online (Sandbox Code Playgroud) 应用程序通常有这样的导航栏:
但是当我添加ViewCompat.setOnApplyWindowInsetsListener()
ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { _, insets ->
binding.showingKeyboard = insets.isVisible(WindowInsetsCompat.Type.ime())
WindowInsetsCompat.CONSUMED
}
Run Code Online (Sandbox Code Playgroud)
或者
ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { _, insets ->
binding.showingKeyboard = insets.isVisible(WindowInsetsCompat.Type.ime())
insets
}
Run Code Online (Sandbox Code Playgroud)
就变成这样了
为什么会发生这种情况?我不希望这个方法改变任何东西。我只是想用它来检测虚拟键盘是否可见(没有其他好的方法可以做到这一点)
我有一个要求,我有一个MainActivity.从这个活动我实例化4个片段(让我们说FragmentA,FragmentB,FragmentC,FragmentD.
这四个片段中的一个; 在3个碎片上(我们说FragmentA,FragmentB,FragmentC),我想设置MainActivity的windowsoftinputmode(),SOFT_INPUT_ADJUST_PAN以便窗口可以调整大小.
在一个Fragment()上让我们说FragmentD),我想将MainActivity的windowsoftinputmode()设置为SOFT_INPUT_ADJUST_NOTHING.
所以我所做的是,在每个Fragment的onViewCreated()方法上,我使用更改LayoutParams标志执行以下代码行:
((MainActivity)getActivity()).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
Run Code Online (Sandbox Code Playgroud)
要么
((MainActivity)getActivity()).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Run Code Online (Sandbox Code Playgroud)
问题是它无法工作,我无法正确设置软件输入,我无法阻止窗口调整大小.
当我在MainActivity的onCreate()中执行它们时,相同的代码行完美地工作,如下所示:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Run Code Online (Sandbox Code Playgroud)
但是为所有四个片段设置了值.清单中的MainActivity声明是:
<activity
android:name="com.test.MainActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"/>
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我做错了吗?我希望不同的碎片有不同的行为.