天天记录 - 一个onFocusChanged问题

在Android开发中,遇到一个焦点管理的问题:当屏幕解锁后,焦点不正确地转移。原因是child view的focusable未清除。解决方案在于理解和正确使用onFocusChanged回调。通过创建Demo验证,发现焦点切换的机制与预期不符,需要深入理解Android的焦点处理机制。
摘要由CSDN通过智能技术生成


     有两种获取焦点的方式,一种是用户自己使用上下左右的方向键移动焦点,另外一种方式是直接调用视图的View.requestFocus()方法,前一种方法最终也是调用requestFocus。


* 遇到问题

问题描述:
     前两天修改一个BUG遇到问题,使用上下把焦点放到一个view上,当锁住屏幕解开屏幕后,焦点会转移到其他view上。

查找出错原因:
     查了下是ViewGr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的示例,演示如何使用 `FocusableOnTouchView` 类来设计一个广告展示的界面: 1. 创建一个 `FocusableOnTouchView` 类的子类 `AdvertisementView`,并在其构造函数中设置 `setClickable(true)`。 ```java public class AdvertisementView extends FocusableOnTouchView { public AdvertisementView(Context context) { super(context); setClickable(true); } // Override onTouchEvent() and onFocusChanged() methods as needed } ``` 2. 在 `AdvertisementView` 类中实现 `onDraw()` 方法,绘制广告的图片和文字信息。 ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // Draw advertisement image Drawable image = getResources().getDrawable(R.drawable.advertisement_image); image.setBounds(0, 0, getWidth(), getHeight()); image.draw(canvas); // Draw advertisement text Paint textPaint = new Paint(); textPaint.setTextSize(20); textPaint.setColor(Color.WHITE); String text = "This is an advertisement"; canvas.drawText(text, getWidth() / 2, getHeight() / 2, textPaint); } ``` 3. 在布局文件中添加 `AdvertisementView` 控件,并使用 `ViewGroup` 类(如 `LinearLayout` 或 `RelativeLayout`)将多个 `AdvertisementView` 控件组合在一起。 ```xml <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <com.example.AdvertisementView android:layout_width="match_parent" android:layout_height="100dp" android:focusable="true" android:focusableInTouchMode="true" /> <com.example.AdvertisementView android:layout_width="match_parent" android:layout_height="100dp" android:focusable="true" android:focusableInTouchMode="true" /> <!-- Add more AdvertisementView controls as needed --> </LinearLayout> ``` 4. 在 `Activity` 类中实现 `View.OnFocusChangeListener` 接口,并将其注册到 `AdvertisementView` 控件中。 ```java public class MainActivity extends AppCompatActivity implements View.OnFocusChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Register onFocusChangeListener to all AdvertisementView controls ViewGroup advertisementContainer = findViewById(R.id.advertisement_container); for (int i = 0; i < advertisementContainer.getChildCount(); i++) { View childView = advertisementContainer.getChildAt(i); if (childView instanceof AdvertisementView) { childView.setOnFocusChangeListener(this); } } } // Implement onFocusChange() method to handle focus change events @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { // Handle advertisement focus change event } } } ``` 这样,您就可以使用 `AdvertisementView` 类来创建一个简单的广告展示界面,并在 `Activity` 类中处理焦点变化事件。当用户聚焦到某个广告控件上时,您可以根据需要执行一些操作,例如打开一个链接或显示更多的广告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值