Android中View如何切换Focus
视图(View)类代表了一种基本的用户界面组成模块。一个视图占据了屏幕上的一个矩形区域,并响应绘制图形和事件处理。视图类是窗体类(Widget)的基类,而窗体类用来生成可交互的用户图形接口(interactive GUI)。
视图类的使用窗口中所有的视图构成一个树形结构。要想增加视图,既可以用直接添加代码的方法,也可以在一个或者多个XML文件中声明新视图构成的树。在视图类的子类中,有的可以用来控制,有的具有显示文字、图片或者其他内容的功能。
当视图树被创建后,以下这若干种通用操作将可以被使用:
1.设置属性(properties):比如,可以设置TextView类的一个实例的文本内容。不同的子类可以用来设置的属性与方法不同。注意:只有编译时能够检测到的属性才可以在XML布局管理(layout)文件中设置。
2.设置输入焦点(focus):为了响应用户输入,整个框架将处理移动的焦点。如果想把焦点强制指向某一个特定的视图,必须调用requestFocus()方法。
3.设置监听器(listener):在视图中,允许设置监听器来捕获用户感兴趣的某些事件。比如说, 在所有的视图中,无论视图是获得焦点还是失去焦点,都可以通过设置监听器来捕获。可以通过调用setOnFocusChangeListener(View.OnFocusChangeListener) 来注册一个监听器。在其他视图子类中,提供了一些更加特殊的监听器。比如,一个按键(Button)可以触发按键被按下的事件。
4.设置是否可视(visibility):可以通过调用setVisibility(int)来显示或者隐藏视图。
下面我以ImageButton为例来说一下如何使用setOnFocusChangeListener来实现focus的切换.
UI如图显示.当focus切换时, 在中间的TextView上显示每个ImageButton的内容.
![](https://www.cnblogs.com/images/cnblogs_com/smoozer/focusable.JPG)
代码如下:
public class MainMenu extends Activity {
private ImageButton btnLogin, btnSet, btnAbout, btnHelp, btnVis;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainmenu);
setTitle("Main Menu-Select One Item#");
// Get the buttons, and set listeners.
btnAbout = (ImageButton)findViewById(R.id.ibtnAbout);
btnAbout.setOnClickListener(listener);
btnAbout.setOnFocusChangeListener(focusListener);
//...
//default focus in Login button.
btnLogin.requestFocus(); //Can not work! Y??? Any one knows this?
// Get the TextView to display text.
tvName = (TextView)findViewById(R.id.tvMenu);
tvName.setText("");
}
OnClickListener listener = new OnClickListener(){
public void onClick(View arg0){
switch(arg0.getId()){
case R.id.ibtnAbout:
tvName.setText("About");
Intent in = new Intent(MainMenu.this, about.class);
startActivity(in);
break;
//...
}
}
};
OnFocusChangeListener focusListener = new OnFocusChangeListener(){
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus){
switch(v.getId()){
case R.id.ibtnAbout:
tvName.setText("About");
break;
//....
}
}
}
};
}
这里有一个问题,我还是不明白. 希望有哪位朋友告知. 当切换到此Activity的时候, 我希望默认的Focus是在Button Login上, 我调用btnLogin.requestFocus();doestn't work! WHY?????
刚开始学Andorid, 知之甚少, 边学边练, 献丑了!
下面我以ImageButton为例来说一下如何使用setOnFocusChangeListener来实现focus的切换.
UI如图显示.当focus切换时, 在中间的TextView上显示每个ImageButton的内容.
代码如下:
public class MainMenu extends Activity {
private ImageButton btnLogin, btnSet, btnAbout, btnHelp, btnVis;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mainmenu);
setTitle("Main Menu-Select One Item#");
// Get the buttons, and set listeners.
btnAbout = (ImageButton)findViewById(R.id.ibtnAbout);
btnAbout.setOnClickListener(listener);
btnAbout.setOnFocusChangeListener(focusListener);
//...
//default focus in Login button.
btnLogin.requestFocus(); //Can not work! Y??? Any one knows this?
// Get the TextView to display text.
tvName = (TextView)findViewById(R.id.tvMenu);
tvName.setText("");
}
OnClickListener listener = new OnClickListener(){
public void onClick(View arg0){
switch(arg0.getId()){
case R.id.ibtnAbout:
tvName.setText("About");
Intent in = new Intent(MainMenu.this, about.class);
startActivity(in);
break;
//...
}
}
};
OnFocusChangeListener focusListener = new OnFocusChangeListener(){
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus){
switch(v.getId()){
case R.id.ibtnAbout:
tvName.setText("About");
break;
//....
}
}
}
};
}
这里有一个问题,我还是不明白. 希望有哪位朋友告知. 当切换到此Activity的时候, 我希望默认的Focus是在Button Login上, 我调用btnLogin.requestFocus();doestn't work! WHY?????
刚开始学Andorid, 知之甚少, 边学边练, 献丑了!