用了接近一个星期的时间终于将慕课上的Android第一季给看完了,在这里不得不给那位amos老师打一个广告,讲的真的很赞。下面直接总结我这周学习的几个点吧。
第一部分 ToggleButton
ToggleButton是一个多状态的按钮,通过这个按钮可以达到一个状态的切换,比如下面这个例子所讲解的。
public class MainActivity extends Activity {
private ToggleButton tb;
private ImageView imgv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tb = (ToggleButton) findViewById(R.id.toggleButton1);
imgv = (ImageView) findViewById(R.id.imageView1);
// 为当前的tb设置监听器,这里采用的是匿名内部类的写法
tb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
/*
* 当tb被点击的时候当前的方法会执行
* ButtonView代表被点击的按钮本身
* 当被点击的按钮有很多的时候就需要有这个参数来表示是第几个控件
* isChecked表示的是被点击的控件的状态
* 当点击这个tb的时候,改变img的背景
*/
public void onCheckedChanged(CompoundButton ButtonView, boolean isChecked) {
imgv.setBackgroundResource(isChecked?R.drawable.on:R.drawable.off);
}
});
}
}
这里togglebutton的作用就是通过点击这个按钮来实现背景图片的一个变化,setBackgroundResource这个函数就是实现这个功能的。
这里笔者曾经犯了一个非常可笑的错误,先把xml配置文件放上来
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignLeft="@+id/toggleButton1"
android:layout_below="@+id/toggleButton1"
android:background="@drawable/off"
/>
笔者在一开始写的时候将android:background="@drawable/off"
这句话写成了android:src="@drawable/off"
,导致的结果是原本的button无法起到切换状态的作用,幸得他人的提醒才发现,笔者因为这个简单的错误纠结了一下午,虽然src和backgroud设置图片上看起来效果一样,但是src的话,上面java代码中的setBackgroundResource函数将无法起到作用,在以后的学习中一定要注意到这一点。
第二部分 CheckBox和RadioGroup以及RadioButton
这部分比较简单,没有什么可以特别讲解的,稍微提一下的是checkbox和RadioButton在某种程度上是对立的,checkbox一般是用于多选的,比如网站上经常会问你对哪些方面的知识感兴趣,这时候下面的选择框就是checkbox,而RadioButton主要是用来作为单选的按钮的,比如网站经常会让人填写性别,这个就需要用到RadioButton,因为人的性别只有一个。
下面分别上两种不同按钮的代码,首先是checkbox
public class MainActivity extends Activity {
private CheckBox checkBox;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化控件
checkBox = (CheckBox) findViewById(R.id.checkBox1);
/*
*对checkbox设置监听事件来判断checkbox是否被选中
*/
checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
System.out.println(isChecked);
if(isChecked){
//获得checkbox的文本内容
String text = checkBox.getText().toString();
Log.i("tag", text);
}
}
});
}
再接着是RadioButton
public class MainActivity extends Activity {
private RadioGroup rg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rg = (RadioGroup) findViewById(R.id.radioGroup1);
/*
*设置radiogroup的监听器
*/
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radio0:
Log.i("tag", "你是一个男孩");
break;
case R.id.radio1:
Log.i("tag", "你是一个女孩");
default:
break;
}
}
});
}
}
第三部分 Intent实现页面的跳转
这是我这周学过的最重要的一个点了,Android的各界面之间是相互联系的,一个应用写出来不可能只有一个界面,那么这些界面要实现相互之间的跳转就需要依靠Intent来实现。
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件。Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙述其所期望的服务或动作、与动作有关的数据等。Android则根据此Intent对象之叙述,负责配对,找出相配的组件,然后将 Intent对象传递给所找到的组件,Android的媒婆任务就完成了。
这段话来自csdn某位大神的博客,个人感觉对Intent的讲解十分到位,这里引用出来供大家参考。
一般来说运用Intent的时候有两种方式来实现页面的跳,一种是无返回值的页面跳转,一种是有返回值的页面跳转。
这里分别对两种方式进行一个介绍
不带返回值的跳转方式
public class FActivity extends Activity{
private Button bt1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.factivity);
bt1 = (Button) findViewById(R.id.button1_first);
// 注册点击事件
bt1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
/*
*1.采用的是startActivity的方式来实现跳转
*2.Intent函数里面的第一参数指的是上下文
*3.第二个参数指的是要跳转的页面
*4.启动跳转
*/
Intent intent = new Intent(FActivity.this, SActivity.class);
startActivity(intent);
}
});
}
startActivity方法就是用来实现无返回值的跳转,返回的是一个intent对象。
带返回值的跳转方式
public class FActivity extends Activity{
private Button bt2;
private TextView tv;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.factivity);
bt2 = (Button) findViewById(R.id.button2_second);
tv = (TextView) findViewById(R.id.textView1);
/*
*这里采用的是第二种的跳转方式,startActivityForResult的方式来进行跳转的
* startActivityForResult的第二参数是请求的一个标识
* 这里即第一个页面
*/
bt2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FActivity.this,SActivity.class);
startActivityForResult(intent, 1);
}
});
}
/*
* requestCode---第一个页面的标识符
* resultCode----第二个页面的标识
* data-----第二个页面返回的数据
*/
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1 && resultCode==2){
String content = data.getStringExtra("data");
tv.setText(content);
}
}
}
而在这里第二个页面也需要作出相应的反应
public class SActivity extends Activity{
private Button bt1_second;
private String res = "你好";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sacivity);
bt1_second = (Button) findViewById(R.id.button1);
bt1_second.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//第二个页面返回给第一个页面的对象其实是一个intent对象
Intent data = new Intent();
data.putExtra("data",res);
//将data回传给第一个页面,第一个是标识符
setResult(2, data);
//结束当前页面
finish();
}
});
}
这里面的finish函数其实就相当java里面的那个销毁的函数,可以节省内存资源。startActivityForResult这个函数用来实现带返回值的Intent的跳转,requestCode,resultCode这两个参数比较重要,因为当一个程序的逻辑复杂到一定程度的时候,这两个参数就可以标识出谁哪个页面需要跳转到哪个页面。