1、怎样在MainActivity中为Button的点击事件绑定一个监听器?(四种方式)
<1>a.查找控件
//查找控件按钮
private Button button1;
button1 = (Button) findViewById(R.id.button1);
b.创建一个类,实现OnClickListener接口,重写里面的OnClick()方法
//OnClickListener()是按钮的监听器类对象,当按钮被点击的时候。
class MyListener implements OnClickListener{
//当按钮被点击的时候,会自动调用的方法
@Override
//v:事件源。被点击的那个控件
public void OnClick(View v){
//这里写被点击之后要执行的任务
button1.setText("点击之后改变的文本内容"+new Date());
}
}
c.用查找到的控件去绑定监听器对象。(按钮对象.setOnClickListener(监听器对象))
MyListener listener =new MyListener();
//绑定按钮的被点击的监听器
button1.setOnClickListener(listener);
<2>a.查找控件
private Button button2;
button2=(Button) findViewById(R.id.button2);
b.让当前类实现OnClickListener接口,重写里面的OnClick()方法
public class MainActivity extends Activity implements OnClickListener{
@Override
public void onClick(View v) {
//在这里写当按钮被点击之后要做的任务
......
}
}
c.用查找到的控件去绑定监听器对象。(按钮对象.setOnClickListener(this))
button2.setOnClickListener(this);
<3>a.查找控件
private Button button3;
button3=(Button)findViewById(R.id.button3);
b.用匿名内部类绑定监听器
button3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//在这里写当按钮被点击之后要做的任务
......
}
});
<4>a.查找布局
private LinearLayout layout;
layout=(LinearLayout)findViewById(R.id.layout);
b.在控件的属性中声明OnClick="方法名"
android:onClick="btnChange"
c.在java文件中写一个方法
public void 方法名(View v){
//在这里写当按钮被点击之后要做的任务
......
}
总结:如果有多个按钮绑定同一个监听器,除了匿名内部类的写法,其他三种方法都可以。
2、怎么实现多个按钮绑定同一个监听器?
<1>查找控件
private Button btn_showText;
provate Button btn_showLog;
btn_showText=(Button)findViewById(R.id.btn_showText);
btn_showLog=(Button)findViewById(R.id.btn_showLog);
<2>创建一个类,实现OnClickListener接口,重写里面的OnClick()方法
class BtnListener implements OnClickListener{
@Override
public void onClick(View v) {
//获取事件源(被点击的按钮)的id
int id=v.getId();
switch(id){
case R.id.btn_showLog:
//这里写当点击btn_showLog是要完成的任务
......
break;
case R.id.btn_showText:
//这里写当点击btn_showText是要完成的任务
......
break;
....
}
}
<3>用查找到的控件去绑定同一个监听器对象
BtnListener listener =new BtnListener();
//两个按钮绑定的监听器对象为同一个
btn_showText.setOnClickListener(listener);
btn_showLog.setOnClickListener(listener);
3、怎么创建一个Activity?
<1>创建一个类,继承Activity
public class SecondActivity extends Activity{}
<2>重写onCreate()生命周期方法,并且在里面调用setContentView()方法绑定要显示的布局文件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_second);
}
<3>在清单配置文件中注册
<!-- 注册activity 只需要写一个必要的属性name-->
<activity android:name="com.qf.day03buttondemo.SecondActivity">
<!-- intent-filter:代表当前的activity是第一个启动的页面 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
4、sp、dp、dip、dpi、pt、px等单位的区别是什么?
<1>dpi
dpi指像素密度。dots per inch ,即每英寸内像素点的个数。它不是表示长度的单位。在android中认为:低(120dpi),中(160dpi),高(240dpi),超高(320dpi)。随着技术的增长,实际dpi已经超出这个定义范围。
<2>dip
device independent pixels ,即与设备无关的像素。目前这个单位已经被dp所取代,而不建议使用dip.
<3>dp
与dip概念一样。不过dp已经取代了dip。在Android中用来表示非文字大小的尺寸。例如:外边距、内填充等。
<4>sp
scale indepentdent pixel ,即与缩放比例无关的像素。在android中常用来表示文字大小。
<5>px
表示像素。因为同样是200px,但是在不同手机下显示的大小是不同的。
<6>pt
point磅。1磅=1/74英寸
总结:dp是用来定义非文字的尺寸,sp用来定义文字大小。px只用于产生一条一像素的分割线时使用。
5、一个适配器控件通过一个适配器展示数据的步骤。
<1>查找控件
private Spinner spinner;
spinner = (Spinner) findViewById(R.id.spinner);
<2>生成数据源
private ArrayList<String> data=new ArrayList<String>();
//初始化一个数据源链表
private void initData(){
数据内容
}
//调用数据源
initData();
<3>构造适配器对象
private ArrayAdapter<String> adapter;
adapter=new ArrayAdapter<String>(this,R.layout.item1);//两参的构造方法
第一个参数:上下文对象
第二个参数:展示数据的布局文件
adapter=new ArrayAdapter<String>(this,R.layout.item1,data);//三参的构造方法
第一个参数:上下文对象
第二个参数:展示数据的布局文件
第三个参数:数据源(可以是链表,也可以是数组)
adapter =new ArrayAdapter<String>(this,R.layout.item2,R.id.textView,data);//四参的构造方法
第一个参数:上下文对象
第二个参数:展示数据的布局文件(不是以TextView作为根节点)
第三个参数:item2中要展示数据的TextView控件的id
第四个参数:数据源
adapter = new SimpleAdapter(this,data,R.layout.item,new String[]{"name","age","icon"},new int[]{R.id.name,R.id.age,R.id.icon})
第一个参数:上下文对象
第二个参数:数据源
第三个参数:展示数据的布局文件
第四个参数:map存储的key值
第五个参数:要对应的value值的控件id
<4>把数据和适配器产生联系(三参、四参的构造方法在构造适配器时就产生联系)
adapter.add("data1");//添加一条数据
adapter.addAll(data);//添加一个链表数据
<5>把适配器和控件绑定(控件.setAdapter(适配器))
spinner.setAdapter(adapter);
//当数据原发生了变化时,及时通知适配器更新
adapter.notifyDataSetChanged();
<6>spinner的选中其中一项数据时候的监听器(OnItemSelectedListener)
需要重写的方法是:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,long id) {
/*
parent:指发生选择事件的适配器控件;
view:指代spinner里面发生选择事件的item的布局视图
position:发生选择事件的item的位置信息(从0开始一次增加)
id:发生选择事件的item的行号id
*/
//需要执行的逻辑代码,如下例:
//把被点击的视图对象转变成TextView对象
TextView TextView=(TextView) view;
String string=textView.getText().toString();
//获取对应的spinner的位置上的展示信息
String string2=(String) parent.getItemAtPosition(position);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
//需要执行的逻辑代码
}
6、为什么将android:layout_weight属性的值同时指定为1就会平分屏幕宽度呢?
系统会先把LInearLayout下所有控件指定的layout_weight值相加,得到一个总值,然后每一个控件所占大小的比例就是用该控件的layout_weight值除以刚才算出的总值。
7、MVC开发模型
MVC(Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器。一个逻辑模型可以对于多种视图模型,比如一批统计数据可以分别用柱状图、饼图来表示。一种视图模型也可以对于多种逻辑模型。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式,而C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新,与设计模式中的观察者模式是完全一样。
MVC的好处:从用户的角度出发,用户可以根据自己的需求。选择自己合适的浏览数据的方式。比如说,对于一篇在线文档,用户可以选择以HTML网页的方式阅读,也可以选择以PDF的方式阅读。从开发者的角度,MVC把应用程序的逻辑层与界面开发是完全分开的,最大的好处是:界面设计人员可以直接参与界面开发,程序员就可以把精力放在逻辑层上。而不是像以前那样,设计人员把所有的材料交给开发人员,由开发人员来实现界面。在Eclipse工具中开发Android采用了更加简单的方法,设计人员在DroidDraw中设计界面,以XML方式保存,在Eclipse中直接打开就可以看到设计人员设计的界面。
Android中界面部分也采用了当前比较流行的MVC框架,在Android中:
1)视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。当然,如果你对Android了解的比较多了的话,就一定可以想到在Android中也可以使用JavaScript+HTML等的方式作为View层,当然这里需要进行Java和JAvaScript之间的通信,幸运的是,Android提供了它们之间非常方便的通信实现。
2)控制层(Controller):Android的控制层的重任常落在了众多的Activity的肩上,这句话暗示了不要在Activity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Activity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在该层的,就是应用程序中的二进制数据。
在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。比如显示Cursor中所有数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在LIstView中实现。