Android添加自动滚动和智能焦点切换

第一种方法:

把布局放到scrollView中,让要显示的View(隐藏的View滚动出来)获取焦点,View会自动滚动出来.

第二种方法:

首先总结一下andorid view的键盘事件处理过程:
  键盘事件首先交给当前Activity中获得焦点的View,该View的setKeyListener(OnKeyListener l)中设定的l的onKey方法被调用,若返回true,framwork不再处理,否则有framework继续处理.我就是用该方法实现的智能焦点切换。

  然后是自动滚动的实现,当ViewGroup中添加了新的View后,不能马上进行滚动,因为此时相应的高度信息还没有更新,需要用Handler来向消息队列投递一个Runnale来进行滚动。

  相关实现如下:
  1.ScrollView2.java 
代码:

  1 package com.google.android.samples.view;   
  2   
  3 import android.app.Activity;   
  4 import android.os.Bundle;   
  5 import android.os.Handler;   
  6 import android.util.Log;   
  7 import android.view.KeyEvent;   
  8 import android.view.View;   
  9 import android.widget.Button;   
 10 import android.widget.LinearLayout;   
 11 import android.widget.ScrollView;   
 12 import android.widget.TextView;   
 13   
 14 import com.google.android.samples.R;   
 15   
 16   
 17 /**  
 18 * Demonstrates wrapping a layout in a ScrollView.  
 19 *  
 20 */  
 21 public class ScrollView2 extends Activity {   
 22     private static final String LOG_TAG = "ScrollView2";   
 23     private LinearLayout mLayout;   
 24     private ScrollView mScrollView;   
 25     private final Handler mHandler = new Handler();   
 26        
 27     @Override  
 28     protected void onCreate(Bundle icicle) {   
 29         super.onCreate(icicle);   
 30         setContentView(R.layout.scroll_view_2);   
 31   
 32         mLayout = (LinearLayout) findViewById(R.id.layout);   
 33         mScrollView = (ScrollView) findViewById(R.id.scrollview);   
 34   
 35         Button button = (Button) findViewById(R.id.add_widget);   
 36         button.setOnClickListener(mClickListener);   
 37         //改变默认焦点切换   
 38         button.setKeyListener(mAddButtonKeyListener);   
 39     }   
 40        
 41     private Button.OnClickListener mClickListener = new Button.OnClickListener() {   
 42         private int mIndex = 1;   
 43         @Override  
 44         public void onClick(View arg0) {   
 45             // TODO Auto-generated method stub        
 46             TextView textView = new TextView(ScrollView2.this);   
 47             textView.setText("Text View " + mIndex);   
 48             LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(   
 49                     LinearLayout.LayoutParams.FILL_PARENT,   
 50                     LinearLayout.LayoutParams.WRAP_CONTENT   
 51             );   
 52             mLayout.addView(textView, p);   
 53   
 54             Button buttonView = new Button(ScrollView2.this);   
 55             buttonView.setText("Button " + mIndex++);   
 56             mLayout.addView(buttonView, p);   
 57             //改变默认焦点切换   
 58             buttonView.setKeyListener(mNewButtonKeyListener);   
 59             //投递一个消息进行滚动   
 60             mHandler.post(mScrollToBottom);   
 61         }          
 62     };   
 63        
 64     private Runnable mScrollToBottom = new Runnable() {   
 65         @Override  
 66         public void run() {   
 67             // TODO Auto-generated method stub   
 68             Log.d(LOG_TAG, "ScrollY: " + mScrollView.getScrollY());   
 69             int off = mLayout.getMeasuredHeight() - mScrollView.getHeight();   
 70             if (off > 0) {   
 71                 mScrollView.scrollTo(0, off);   
 72             }                          
 73         }   
 74     };   
 75       
 76     private View.OnKeyListener mNewButtonKeyListener = new View.OnKeyListener() {   
 77         public boolean onKey(View v, int keyCode, KeyEvent event) {   
 78             if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN &&   
 79                     event.getAction() == KeyEvent.ACTION_DOWN &&   
 80                     v == mLayout.getChildAt(mLayout.getChildCount() - 1)) {   
 81                 findViewById(R.id.add_widget).requestFocus();   
 82                 return true;   
 83             }   
 84             return false;   
 85         }   
 86     };   
 87        
 88     private View.OnKeyListener mAddButtonKeyListener = new Button.OnKeyListener() {   
 89         @Override  
 90         public boolean onKey(View v, int keyCode, KeyEvent event) {   
 91             // TODO Auto-generated method stub   
 92             Log.d(LOG_TAG, event.toString());   
 93                
 94             View viewToFoucus = null;   
 95             if (event.getAction() == KeyEvent.ACTION_DOWN) {   
 96                 switch (keyCode) {   
 97                 case KeyEvent.KEYCODE_DPAD_UP:   
 98                     int iCount = mLayout.getChildCount();   
 99                     if ( iCount > 0) {   
100                         viewToFoucus = mLayout.getChildAt(iCount - 1);   
101                     }   
102                     break;   
103                 case KeyEvent.KEYCODE_DPAD_DOWN:   
104                     if (mLayout.getChildCount() > 1) {   
105                         viewToFoucus = mLayout.getChildAt(1);   
106                     }   
107                     break;   
108                 default:   
109                     break;   
110                 }   
111             }   
112                
113             if (viewToFoucus != null) {   
114                 viewToFoucus.requestFocus();   
115                 return true;   
116             } else {   
117                 return false;   
118             }   
119         }   
120     };   
121 }

 

  2.scroll_view_2.xml

代码:

 1 <?xml version="1.0" encoding="utf-8"?>   
 2 <!-- Demonstrates scrolling with a ScrollView. -->   
 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
 4     android:layout_width="fill_parent"  
 5     android:layout_height="wrap_content"  
 6     android:orientation="vertical">   
 7     <Button id="@+id/add_widget"  
 8         android:layout_width="wrap_content"  
 9         android:layout_height="wrap_content"  
10         android:text="Add Widget"/>   
11 <ScrollView id="@+id/scrollview"  
12     android:layout_width="fill_parent"  
13     android:layout_height="wrap_content"  
14     android:scrollbars="vertical">   
15     <LinearLayout   
16         id="@+id/layout"  
17         android:orientation="vertical"  
18         android:layout_width="fill_parent"  
19         android:layout_height="wrap_content">   
20     </LinearLayout>   
21 </ScrollView>   
22 </LinearLayout>

 

posted @ 2013-06-14 11:08  zghbhdxw  阅读(1343)  评论(0编辑  收藏  举报