<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="增加按钮" />
<ScrollView
android:id="@+id/scrollView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical">
<LinearLayout
android:id="@+id/linearLayout1"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</LinearLayout>
</ScrollView>
</LinearLayout>
package com.scrollview;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
public class ScrollViewActivity extends Activity {
/** Called when the activity is first created. */
private Button button1;
private ScrollView scrollView1;
private LinearLayout linearLayout1;
private final Handler mHandler = new Handler();
private static final String LOG_TAG = "ScrollViewActivity";
@Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
linearLayout1 = (LinearLayout) findViewById(R.id.linearLayout1);
scrollView1 = (ScrollView) findViewById(R.id.scrollView1);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new Button.OnClickListener() {
private int mIndex = 1;
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
TextView textView = new TextView(ScrollViewActivity.this);
textView.setText("Text View " + mIndex);
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT
);
linearLayout1.addView(textView, p);
Button buttonView = new Button(ScrollViewActivity.this);
buttonView.setText("Button " + mIndex++);
linearLayout1.addView(buttonView, p);
//改变默认焦点切换
buttonView.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN &&
event.getAction() == KeyEvent.ACTION_DOWN &&
v == linearLayout1.getChildAt(linearLayout1.getChildCount() - 1)) {
findViewById(R.id.button1).requestFocus();
return true;
}
return false;
}
});
//投递一个消息进行滚动
mHandler.post(mScrollToBottom);
}
});
//改变默认焦点切换
button.setOnKeyListener(new Button.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
Log.d(LOG_TAG, event.toString());
View viewToFoucus = null;
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
int iCount = linearLayout1.getChildCount();
if ( iCount > 0) {
viewToFoucus = linearLayout1.getChildAt(iCount - 1);
}
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
if (linearLayout1.getChildCount() > 1) {
viewToFoucus = linearLayout1.getChildAt(1);
}
break;
default:
break;
}
}
if (viewToFoucus != null) {
viewToFoucus.requestFocus();
return true;
} else {
return false;
}
}
});
}
private Runnable mScrollToBottom = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Log.d(LOG_TAG, "ScrollY: " + scrollView1.getScrollY());
int off = linearLayout1.getMeasuredHeight() - scrollView1.getHeight();
if (off > 0) {
scrollView1.scrollTo(0, off);
}
}
};
}