Kau*_* NP 9 android focus android-view navigation-drawer
我的问题很简单.如何清除在查看所有元素,可能有焦点的对焦(像 EditText -或- TextView其textIsSelectable="true"与文本在它选择在clearFocus事件的发生).
为什么要问(如果我没有得到上面的通用回复):
我通过导航视图访问的片段很少.我的主要目标是在导航视图中打开抽屉时失去片段中元素的焦点.我知道有可能获取NavigationDrawer的方法,并在我的MainActivity中设置它,以便在抽屉打开时,如果其中一个片段中的我的EditText打开,我调用hideSoftKeyboard代码,以便它关闭SoftKeyboard.onDrawerSlide
我的代码在抽屉打开时获取事件 :(在MainActivity的onCreate()方法中)
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
{
//Hide SoftKeyboard on Navigation Drawer Open
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
//Hide SoftKeyboard if it is open
hideSoftKeyboard();
//And Make any view having focus loose focus
//...
//ClearFocus for the whole view is done from here (for whichever Fragment is visible right now)
super.onDrawerSlide(drawerView, slideOffset);
}
};
public void hideSoftKeyboard() //Declared outside onCreate
{
InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
Run Code Online (Sandbox Code Playgroud)
在这里,我的hideSoftKeyboard()代码是通用的,并且可以关闭SoftKeyboard,无论目前可从MainActivity本身看到什么片段.类似地,我想清除所有EditTexts和TextView的焦点(因为复制/粘贴选项在打开时显示在抽屉的中间).
我知道我可以为每个片段编写调用onDrawerSlide函数的代码并单独清除每个元素的Focus,但我想知道是否可以使用通用解决方案,如果是,那么该怎么做.
(如果有可能,可能会有很多含义,可能在很多情况下有所帮助)
Kau*_* NP 10
好吧,我终于决定不再等待一般性答案,所以决定onDrawerSlide 为每个片段实现.事实证明,即使这有点棘手,因为您需要访问工具栏并使用当前抽屉设置您的抽屉,并且进行了一些实验就是呕吐NPE!(只是我平常的运气)
因此,当这个闪现给我时,正在通过官方Android开发者网站获取任何见解.为什么不用getCurrentFocus来获取我现在的观点然后clearFocus()呢!而且,它很有效.我一直专注于复杂的情况,以至于我忘了查看简单的部分.
所以这是我自己的问题的答案:(在onCreate for MainActivity)
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
{
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
hideSoftKeyboard();
getCurrentFocus().clearFocus(); //clear focus - any view having focus
super.onDrawerSlide(drawerView, slideOffset);
}
Run Code Online (Sandbox Code Playgroud)
感谢@keivan Esbati指出了一个我没有注意到的漏洞,因为我使用了虚拟视图(在布局xml中使用,因此只要加载布局,第一个EditText就不会得到焦点).根据Android开发者论坛:
clearFocus():当View清除焦点时,框架会尝试从顶部开始关注第一个可聚焦视图.因此,如果此View是从顶部开始可以获得焦点的第一个视图,则将调用与清除焦点相关的所有回调,之后框架将关注此视图.
甲圆即将这是ofcourse设置调用只要布局被加载聚焦虚拟变量(方法I中使用)或此通过@keivan共享.
注意:我已经为它提供了赏金,因为没有人能够回答我自己得到了答案,想知道将会发生什么奖励:D
更新:Bounty已过期,嗯,什么也没发生.如果你遵循广告理论,那就猜对了.
要从视图中清除焦点,您可以调用getCurrentFocus().clearFocus()但要记住,这只会将焦点从当前视图移到视图中的第一个元素,而不是完全从视图中移出焦点;因此,如果布局中的第一个元素是,EditText它将再次获得关注。
确保您的视图不再获得焦点的一种方法是将此属性添加到xml中的根视图中,从而使根视图能够捕获焦点:
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants"
Run Code Online (Sandbox Code Playgroud)
所以,如果你申报你的根元素像它下面会自动对焦赶上之前到达子视图:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusableInTouchMode="true"
android:descendantFocusability="beforeDescendants">
<!-- Rest of Layout -->
<.../>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8572 次 |
| 最近记录: |