Android focus处理

系统框架将处理日常的焦点移动来响应用户的输入,它包刮改变焦点(当界面是被移除,隐藏,或者作为一个新的View变为可用状态),通过isFocusable()这个方法我们可以知道view是否具有接受焦点的资格,也可以通过setFocusable().来设置view接受焦点的资格,对应在触摸模式下,你可以调用isFocusableInTouchMode().来获知是否有焦点来响应点触,也可以通过setFocusableInTouchMode().来设置是否有焦点来响应点触的资格. 
系统框架控制焦点移动到另一个组件的算法是在某一方向上邻近的组件,在极个别情况下,默认的算法可能不符合开发者的预想要求,在这种情况下,你可以覆写下列XML属性的布局文件:nextFocusDown ,nextFocusLeft ,nextFocusRight ,和nextFocusUp 设置他们的值来明确 
        焦点从当前界面移动下个界面的Id。例如: 
<LinearLayout 
android:orientation="vertical" 
... > 
<Button android:id="@+id/top" 
android:nextFocusUp="@+id/bottom" 
... /> 
<Button android:id="@+id/bottom" 
android:nextFocusDown="@+id/top" 
... /> 
</LinearLayout> 
一般来说,在这个垂直布局,浏览的焦点会从第一个按钮开始,不会是从第二个或者其他的,现在topButtont已经通过nextFocusUp (反之亦然)确定了bottom. 

      通常如果你想宣布用户界面具有焦点的资格 (如果这个界面在传统上是没有的),可以在xml布局里去加上的android:focusable的属性,并设置它的值,您也可以宣布在触摸模式下具有焦点的资格,同样也只在xml里添android:focusableInTouchMode.的属性,并设置它的值. 当用户请求在某个界面聚集焦点时,会调用requestFocus().这个方法。监听到焦点活动(获得焦点或失去焦点都会被通知),会调用onFocusChange(),这个方法。虽然帖子比较短,但是我感觉这个例子还是非常有用的,希望对开发者有一些帮助。想继续交流的可以回帖。

//监听焦点事件
et_search.setOnFocusChangeListener(new OnFocusChangeListener() {
				
				@Override
				public void onFocusChange(View v, boolean isFocused) {
					// TODO Auto-generated method stub
					System.out.println(isFocused);
					if(!isFocused){
						et_search.setVisibility(View.GONE);
					}
				}
			});


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 中,焦点移动可以通过以下几种方式实现: 1. 通过代码设置焦点:可以通过调用 View 的 requestFocus() 方法来设置焦点,例如: ``` EditText editText = findViewById(R.id.editText); editText.requestFocus(); ``` 2. 通过 XML 属性设置焦点:可以在 XML 文件中使用 android:focusable 和 android:focusableInTouchMode 属性来设置 View 是否可获得焦点,例如: ``` <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" /> ``` 3. 通过监听器处理焦点:可以通过设置 View 的 OnFocusChangeListener 来监听焦点变化事件,例如: ``` editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { // 处理获取焦点事件 } else { // 处理失去焦点事件 } } }); ``` 4. 通过键盘事件处理焦点:可以在处理键盘事件时,根据当前焦点 View 的 ID 或位置,计算出下一个需要获得焦点的 View,并调用其 requestFocus() 方法来设置焦点,例如: ``` editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) { View nextView = v.focusSearch(View.FOCUS_DOWN); if (nextView != null) { nextView.requestFocus(); return true; } } return false; } }); ``` 以上是几种常见的焦点移动方式,可以根据自己的需求选择合适的方式来实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT人.阿标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值