第一种方法:
把布局放到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>