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[]數組中。
看代碼:
在Activity中的用法就簡單了:
如果彈出PasswordPopupWindow后沒有彈出輸入法,則強制顯示輸入法:
PasswordPopupWindow的布局文件popup_window_password.xml如下:
動畫文件:
anim_top_in.xml
anim_top_out.xml
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>
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

