`

android 焦点控制及运用

阅读更多
setFocusable()   设置view接受焦点的资格   
isFocusable()    view是否具有接受焦点的资格  

setFocusInTouchMode()      对应在触摸模式下,设置是否有焦点来响应点触的资格         
isFocusableInTouchMode()  对应在触摸模式下,view是否具有焦点的资格

强制view焦点获取,注意:这些方法都不会触发事件(onTouch,onClick等),想要触发onClick事件请调用view.performClick()
requestFocus()                                 ------ view
requestFocus(int direction)当用户在某个界面聚集焦点,参数为下面的4个
requestFocusFromTouch()    触摸模式下
  ......
requestChildFocus (View child, View focused)   ------viewGroup
1 父元素调用此方法
2 child  将要获取焦点的子元素
3 focused 现在拥有焦点的子元素

一般也可以通过 配置文件设置
View.FOCUS_LEFT     Move focus to the left
View.FOCUS_UP       Move focus up
View.FOCUS_RIGHT    Move focus to the right
View.FOCUS_DOWN     Move focus down            
代码设置实现 其实都是通过这些设置的        

isInTouchMode()    触摸模式

-------------------------------------------------------------------------------
下面的例子主要使用了requestFocus()方法使焦点在各个控件之间切换。
看下图:



最上面的弹出框是个PopupWindow,需要依次输入4个密码,为了方便快捷,当上一个文本框输入值之后,焦点自动切换到下一个文本框,当输入到最后一个文本框后,PopupWindow自动关闭,并返回4个文本框中的值,放在String[]数组中。
看代码:
package com.reyo.view;

import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout.LayoutParams;
import android.widget.PopupWindow;

import com.reyo.merchant2.R;

public class PasswordPopupWindow extends PopupWindow {

	private Context context;
	private EditText[] texts;
	private ImageButton btn_close;

	public PasswordPopupWindow(Context context, View view) {
		super(view, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, true);
		this.context = context;
		this.setBackgroundDrawable(new BitmapDrawable());// 响应返回键,响应触摸周边消失
		this.setAnimationStyle(R.style.PopupAnimationFromTop);
		this.setInputMethodMode(PopupWindow.INPUT_METHOD_FROM_FOCUSABLE);
		texts = new EditText[4];
		texts[0] = (EditText) view.findViewById(R.id.et_0);
		texts[1] = (EditText) view.findViewById(R.id.et_1);
		texts[2] = (EditText) view.findViewById(R.id.et_2);
		texts[3] = (EditText) view.findViewById(R.id.et_3);
		for (int i = 0; i < texts.length; i++) {
			final int curIndex = i;
			texts[i].addTextChangedListener(new TextWatcher() {

				@Override
				public void onTextChanged(CharSequence s, int start,
						int before, int count) {
					// TODO Auto-generated method stub

				}

				@Override
				public void beforeTextChanged(CharSequence s, int start,
						int count, int after) {
					// TODO Auto-generated method stub

				}

				@Override
				public void afterTextChanged(Editable s) {
					// TODO Auto-generated method stub
					int nextIndex = curIndex + 1;
					//当输入到最后一个EditText时关闭PopupWindow
					if (nextIndex >= texts.length) {
						dismiss();
						return;
					}
					texts[nextIndex].requestFocus();
				}
			});
		}

		btn_close = (ImageButton) view.findViewById(R.id.btn_close);
		btn_close.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				dismiss();
			}
		});

		this.setOnDismissListener(onDismissListener);

	}

	private OnDismissListener onDismissListener = new OnDismissListener() {

		public void onDismiss() {
			// TODO Auto-generated method stub
			if (onCompleteListener != null) {
				String[] text = new String[texts.length];
				for (int i = 0; i < texts.length; i++) {
					text[i] = texts[i].getText().toString();
				}
				onCompleteListener.onComplete(text);
			}
			// 清空&归位
			for (int i = 0; i < texts.length; i++) {
				texts[i].setText("");
			}
			texts[0].requestFocus();
		}

	};

	private OnCompleteListener onCompleteListener;

	public void setOnCompleteListener(OnCompleteListener onCompleteListener) {
		this.onCompleteListener = onCompleteListener;
	}

	public interface OnCompleteListener {
		public void onComplete(String[] texts);
	}

}


在Activity中的用法就简单了:
private PasswordPopupWindow popupWindow;

if (popupWindow == null) {
LayoutInflater mLayoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View popup_view = mLayoutInflater.inflate(R.layout.popup_window_password,null);
popupWindow = new PasswordPopupWindow(context, popup_view);
//					popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_FROM_FOCUSABLE);
					popupWindow.showAtLocation(container, Gravity.TOP, 0, 0);
					popupWindow.setOnCompleteListener(new PasswordPopupWindow.OnCompleteListener() {

								@Override
								public void onComplete(String[] texts) {
									// TODO Auto-generated method stub
									StringBuffer sb = new StringBuffer();
									for (int i = 0; i < texts.length; i++) {
										sb.append(texts[i]);
									}
									String p=sb.toString();
									if(p.length()==texts.length){
//doSomethingYouWant();
																		}
								}
							});
				} else {
					if (!popupWindow.isShowing()) {
						popupWindow.showAtLocation(container, Gravity.TOP, 0, 0);
					}
				}
				// 强制显示输入法
				toggleSoftInput(context);


如果弹出PasswordPopupWindow后没有弹出输入法,则强制显示输入法:
/**
	 * 如果输入法打开则关闭,如果没打开则打开
	 * 
	 * @param context
	 */
	protected void toggleSoftInput(Context context) {
		InputMethodManager inputMethodManager = (InputMethodManager) context
				.getSystemService(Context.INPUT_METHOD_SERVICE);
		inputMethodManager.toggleSoftInput(0,
				InputMethodManager.HIDE_NOT_ALWAYS);
	}


PasswordPopupWindow的布局文件popup_window_password.xml如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_vertical"
    android:orientation="vertical" 
    android:background="@color/gray1"
    >
    <ImageButton
        android:id="@+id/btn_close"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:background="@android:color/transparent"
        android:src="@drawable/bg_btn_close"
        android:scaleType="center"
        android:layout_gravity="top|right"
        />
    
	    
	
    <LinearLayout 
        android:layout_width="match_parent"
    	android:layout_height="wrap_content" 
   		android:orientation="horizontal"
   		android:gravity="center"
        >
        <EditText 
            android:id="@+id/et_0"
            android:layout_width="wrap_content"
    		android:layout_height="wrap_content" 
    		android:inputType="textPassword"
    		android:singleLine="true"
    		android:minWidth="60dp"
    		android:minHeight="60dp"
    		android:maxLength="1"
    		android:layout_marginLeft="10dp"
    		android:layout_marginRight="10dp"
    		android:gravity="center"
    		android:textSize="@dimen/font_xxxbig"
            />
        <EditText 
            android:id="@+id/et_1"
            android:layout_width="wrap_content"
    		android:layout_height="wrap_content" 
    		android:inputType="textPassword"
    		android:singleLine="true"
    		android:minWidth="60dp"
    		android:minHeight="60dp"
    		android:maxLength="1"
    		android:layout_marginLeft="10dp"
    		android:layout_marginRight="10dp"
    		android:gravity="center"
    		android:textSize="@dimen/font_xxxbig"
            />
        <EditText 
            android:id="@+id/et_2"
            android:layout_width="wrap_content"
    		android:layout_height="wrap_content" 
    		android:inputType="textPassword"
    		android:singleLine="true"
    		android:minWidth="60dp"
    		android:minHeight="60dp"
    		android:maxLength="1"
    		android:layout_marginLeft="10dp"
    		android:layout_marginRight="10dp"
    		android:gravity="center"
    		android:textSize="@dimen/font_xxxbig"
            />
        <EditText 
            android:id="@+id/et_3"
            android:layout_width="wrap_content"
    		android:layout_height="wrap_content" 
    		android:inputType="textPassword"
    		android:singleLine="true"
    		android:minWidth="60dp"
    		android:minHeight="60dp"
    		android:maxLength="1"
    		android:layout_marginLeft="10dp"
    		android:layout_marginRight="10dp"
    		android:gravity="center"
    		android:textSize="@dimen/font_xxxbig"
            />
    </LinearLayout>
	<TextView
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:text="请输入操作密码(该操作由服务员完成)"
	        android:textColor="@color/white"
	        android:textSize="@dimen/font_middle"
	        android:singleLine="true"
	        android:layout_margin="20dp"
	        android:layout_gravity="center_horizontal"
	        />
</LinearLayout>


动画文件:
<style name="PopupAnimationFromTop" parent="android:Animation"  mce_bogus="1" >
        <item name="android:windowEnterAnimation">@anim/anim_top_in</item>
        <item name="android:windowExitAnimation">@anim/anim_top_out</item>
    </style>


anim_top_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
	<translate 
	android:fromYDelta="-100%p" 
	android:toYDelta="0" 
	android:duration="200" 
	android:fillAfter="true"
	android:interpolator="@android:anim/bounce_interpolator"
	/>
</set>

anim_top_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
	<translate 
	android:fromYDelta="0" 
	android:toYDelta="-100%p" 
	android:duration="200"
	android:fillAfter="true"
	android:interpolator="@android:anim/bounce_interpolator"
	/>
</set>

  • 大小: 142.2 KB
分享到:
评论

相关推荐

    Android焦点控制原理及源码

    下面我们将深入探讨Android焦点控制的原理以及如何通过源码来调整这一行为。 首先,Android中的焦点控制主要包括四个步骤: 1. **焦点获取**:当用户操作(如点击或按键)使得某个控件变得可聚焦时,该控件会获取...

    AndroidTV焦点控制实例

    在Android TV开发中,焦点控制是一项...总的来说,理解并掌握Android TV的焦点控制机制对于构建高质量的TV应用至关重要。通过不断的实践和学习,开发者能够创建出用户友好、易于导航的TV界面,从而提升用户的使用体验。

    Android 焦点事件

    本文将深入探讨Android焦点事件的概念、机制以及如何在实际开发中进行有效管理。 一、焦点事件概述 焦点事件在Android中是指当用户在触摸屏上操作时,某个可聚焦的视图(如TextView、EditText或Button)获取或失去...

    android中模拟焦点移动

    首先,了解Android焦点系统的基础。在Android中,每个可以接收输入的View(如Button、EditText)都有一个焦点状态,分为两种:获得焦点(focused)和无焦点(unfocused)。焦点的移动是由系统的焦点管理器自动处理的...

    android软键盘上移动焦点

    在Android开发中,软键盘的焦点管理是一项关键任务,特别是在电视应用中,用户通常依赖遥控器而非触摸屏进行交互。本文将深入探讨如何在Android软键盘上实现焦点移动,并支持上下左右按键以及回车键输入,以拉丁IME...

    Android TV 上使用的RecyclerView和焦点框架,焦点框移动效果,完胜androidTvwidget的MainUpView

    在Android TV应用开发中,`RecyclerView`和焦点框架的运用是至关重要的,因为它们直接影响到用户的交互体验。本文将深入探讨如何在Android TV上利用`RecyclerView`和焦点框架实现高效且美观的焦点移动效果,以及如何...

    Android 蓝牙 音频焦点(Audio Focus)——卡音,多年安卓开发经验,从实际项目中获取到的经验,对安卓开发者非常有

    在Android平台上,音频焦点(Audio Focus)是一个至关重要的概念,它涉及到多应用音频播放的协调,尤其是在涉及蓝牙设备如蓝牙耳机或扬声器时。当多个应用试图同时播放音频时,音频焦点机制确保了音频流之间的和谐共存...

    Gallery 遥控器焦点控制流程以及代码实现

    此text记录了Gallery2获取遥控器焦点的流程以及代码的实现,这个代码可以按照我的代码流程复制进去直接使用,这是Gallery焦点的事件分发流程

    Android应用源码之Gallery2_Android.zip

    Gallery2是一个针对Android平台的开源图片浏览应用,其源码为我们提供了一个深入理解Android系统中图片展示、手势操作以及图片库集成的实例。通过分析这个项目,我们可以学习到许多关于Android开发的重要知识点。 ...

    android 焦点事件

    在Android系统中,焦点...了解并掌握这些知识点,可以帮助开发者优化应用程序的交互体验,提供更符合用户习惯的焦点控制。在实际项目中,合理地处理焦点事件能够提升应用的易用性和用户体验,从而提高应用的整体质量。

    Android EditText(失焦+焦点)+登录界面

    在Android开发中,`EditText`是用户输入文本的控件,常见于登录界面等需要用户交互的场景。本文将深入探讨`EditText`的焦点管理以及如何构建一个基本...理解并熟练运用这些知识,对于开发高质量的Android应用至关重要。

    模仿小米焦点控制

    在Android开发中,"模仿小米焦点控制"是一个常见的需求,特别是在设计用户界面(UI)时,尤其是对于电视盒或者智能电视应用。小米盒子UI以其独特的交互体验和视觉效果著称,其中焦点放大与阴影效果是其特点之一。...

    Android 自定义Button按钮显示样式(正常、按下、获取焦点)

    在Android开发中,自定义控件是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何自定义一个Button,使其在不同状态(正常、按下、获取焦点)下呈现出不同的显示样式。我们将通过创建一个自定义的Button...

    Android高级应用源码-TV端GridView焦点移动事件处理.zip

    此资源包"Android高级应用源码-TV端GridView焦点移动事件处理.zip"主要关注的是如何在电视设备上处理GridView的焦点移动事件,这对于构建针对大屏幕设备的用户界面至关重要。GridView是Android中的一个视图组件,它...

    android 具有背景图片的按钮 ImageButton的焦点事件以及事件处理

    在Android系统中,焦点是用户交互的中心,当前处于可接收用户输入状态的视图会拥有焦点。焦点可以在多个可聚焦的视图之间转移,例如在触摸屏上,焦点通常跟随用户的触摸动作。`ImageButton`作为可点击的视图,自然也...

    android按钮被选点击得到焦点失去焦点切换图片

    当然,对于简单的应用,也可以直接在XML布局中使用`android:background`属性和状态选择器(`&lt;selector&gt;`)来实现类似的效果,但自定义按钮类提供了更大的定制空间和更好的代码组织。通过这种方式,你可以更轻松地...

    Android没有输入焦点类控件的输入法

    标题提到的“Android没有输入焦点类控件的输入法调用”指的是在Android开发中,如何在那些不遵循常规焦点机制的控件上触发输入法显示。下面我们将详细探讨这个问题。 首先,了解Android的焦点机制。在Android中,...

    android 通讯录+流量控制+声音控制

    在Android平台上,开发一款应用程序涉及多个模块,如通讯录管理、流量监控以及声音控制。以下是对这些关键功能的详细解析: 1. **Android 通讯录管理**: - **获取联系人信息**:Android提供了ContentResolver类,...

    Android 焦点图片滚动源码.zip

    【Android 焦点图片滚动源码】是一个用于Android应用开发的项目,它实现了图片焦点滚动的功能,通常在轮播图、广告展示等场景中应用广泛。这个源码提供了详细的实现逻辑,对于开发者来说,是一个很好的学习和参考...

Global site tag (gtag.js) - Google Analytics