分享

android 滚动视图(ScrollView)学习与应用

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

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

相关实现如下:
1.ScrollView2.java
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
Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <!-- Demonstrates scrolling with a ScrollView. -->   
  3. <LinearLayout xmlns:android="http://schemas./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>  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多