我要用ScrollView写一个小程序。当最后一行获得焦点时,按向下导航键时第一个button按钮获得焦点,若当前焦点在第一个button按钮,按下向上导航键后使得最后一个button按钮获得焦点。但是在3.0版本上,首次获得焦点的总是logo。
以下是我的源代码:public class ScrollViewActivity extends Activity {
    /** Called when the activity is first created. */
private LinearLayout mLayout;
private ScrollView mScollview;
private Handler mhandler = new Handler();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mLayout = (LinearLayout)findViewById(R.id.mlLayout);
        mScollview =(ScrollView) findViewById(R.id.scollview);
        Button b = (Button)findViewById(R.id.button);
        b.setOnClickListener(mClickListener);
    }
    
    
    @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
     Button b = (Button) this.getCurrentFocus();
     int count = mLayout.getChildCount();
     Button mb = (Button) mLayout.getChildAt(count - 1);
     if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN && b.getId() == mb.getId()){
     this.findViewById(R.id.button).requestFocus();
     return true;
     }else
     if(keyCode == KeyEvent.KEYCODE_DPAD_UP && b.getId() == R.id.button){
     mb.requestFocus();
     return true;
     }
return false;
}
    private Runnable mScrollToButton = new Runnable(){ @Override
public void run() {
// TODO Auto-generated method stub
int off = mLayout.getMeasuredHeight() - mScollview.getHeight();
if(off > 0){
mScollview.scrollTo(0, off);
}
}

};
private Button.OnClickListener mClickListener = new Button.OnClickListener(){
     private int index = 1;
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
TextView textView = new TextView(ScrollViewActivity.this);
textView.setText("textview" + index);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
mLayout.addView(textView,params);
Button button = new Button(ScrollViewActivity.this);
button.setText("button" + index);
button.setId(index++);
mLayout.addView(button,params);
mhandler.post(mScrollToButton);

}
    
    };
   
}

解决方案 »

  1.   

    我在onKeyDown方法里加上了这样一行代码,虽然程序运行时最先获得焦点的仍然是上方的logo,但是不会报错了。算是权宜之计。if((this.getCurrentFocus()) instanceof Button){      Button b = (Button) this.getCurrentFocus();
            int count = mLayout.getChildCount();
            Button mb = (Button) mLayout.getChildAt(count - 1);
            if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN && b.getId() == mb.getId()){
                this.findViewById(R.id.button).requestFocus();
                return true;
            }else
            if(keyCode == KeyEvent.KEYCODE_DPAD_UP && b.getId() == R.id.button){
                mb.requestFocus();
                return true;
            }
           } 
    return false;