一. 熟悉XML文件,并做简单修改
开发环境是Android studio. activity_main.xml文件是是描述和布局相关
1.熟悉 activity_main.xml文件
- layout 布局
- Activity每个可视化窗口
- TextView 首字母大写,表明这个控件是个类对象,是View的子类,继承View
“wrap_content” 表示取决于内容
“fill_parent” 表示填充整个窗口 - 可以切换代码模式和图形模式
2. 修改xml文件,实现按钮和复选框
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.myapplication.MainActivity"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你好"
android:id="@+id/textView" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="ALL ON"/>
<CheckBox
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="LED1"/>
<CheckBox
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="LED2"/>
<CheckBox
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="LED3"/>
<CheckBox
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="LED4"/>
</LinearLayout>
layout中有的这几个控件,相对位置应该由layout的属性决定
LinearLayout 表示线性
android:orientation=“vertical” 添加垂直排列属性
- 效果如下
二、增加逻辑,修改MainActivity.java文件
2.1 实现逻辑:
- 如果按下ALLON 那么按钮变为ALLOFF
同时勾选4个LED - 如果按下ALLOFF 那么按钮变为ALLON
取消勾选LED - 单独勾选LED
2.2 修改MainAcitvity.java文件
2.2.1 Button的用法
- Button的用法
要想操作Button,查看button的用法,选中button shift+F1跳转到页面
file:///C:/androidSDK/sdk1/docs/reference/android/widget/Button.html
首先实例化Button对象,然后设置按钮监听函数
需要用到按钮的id,在XML文件中添加按钮id
2.2.2 分析默认生成的 MainActivity.java文件
- MainActivity.java
package com.example.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
- MainActivity.java 这是主程序的入口文件
- package 将程序打包,封装成类
- import android.os.Bundle;每个extends 了Activity的类中 oncreat方法都需要传递一个bundle 参数
- OnCreate 是Andorid中的一个特别的函数,来“表示一个窗口正在生成” 对应import android.os.Bundle
- super.onCreate(savedInstanceState) 就是调用父类的onCreate构造函数,savedInstanceState是保存当前Activity的状态信息。
- setContentView(R.layout.activity_main) activity_main就是当前项目res下的layout里的activity_main.xml文件
2.2.3 修改 MainActivity.java 实现按钮状态切换
- MainActivity.java
package com.example.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
public class MainActivity extends AppCompatActivity {
boolean ledon = false;
private Button button = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.BUTTON);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
ledon =!ledon;
if(ledon)
button.setText("ALL OFF");
else
button.setText("ALL ON");
}
});
}
}
- 下边的View.OnClickListener 是个接口,在android.view.View这个包中,所以引入
- 定义boolean类型变量 ledon 表示led的状态
- 定义私有变量 private Button button = null; 实例化Button
- button = (Button) findViewById(R.id.BUTTON); button这个按钮变量指向BUTTON按钮,android 的用户界面一般使用xml文件做的,对应的xml文件在layout包下如果xml里放了个按钮什么的,在activity中要获取该按钮就用findViewById(R.id.xml文件中对应的id)
编译是为了让AS根据xml文件生成一些java源代码,编译完之后,在程序文件中选择BUTTON 按CTRL+B就可以跳转到XML文件
Alt+F7 可以找到BUTTON对应的整数
- setOnClickListener 设置监听器,按下按钮的时候这个函数就会被调用,new View.OnClickListener() 表示匿名类
- 通过ledon变量改变按钮上的文字
- 这种方法称为匿名类
2.2.4 用另外个方法实现
- MainActivity.java
package com.example.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
public class MainActivity extends AppCompatActivity {
boolean ledon = false;
private Button button = null;
class MyButtonListener implements View.OnClickListener{
@Override
public void onClick(View v) {
ledon =!ledon;
if(ledon)
button.setText("ALL OFF");
else
button.setText("ALL ON");
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.BUTTON);
button.setOnClickListener(new MyButtonListener());
/*
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
ledon =!ledon;
if(ledon)
button.setText("ALL OFF");
else
button.setText("ALL ON");
}
});*/
}
}
- View.OnClickListener()是一个接口,我们可以定义一个类实现这个接口,MyButtonListener定义这个类,按Ctrl+i就可以自动补全onClick代码
- 设置buuton监听器 ,创建MyButtonListener自定义类对象,将这个内部类的对象传入按钮的setOnClickListener方法中
2.2.5 增加控制复选框
- MainActivity.java
package com.example.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.widget.CheckBox;
public class MainActivity extends AppCompatActivity {
boolean ledon = false;
private Button button = null;
private CheckBox checkBoxled1 = null;
private CheckBox checkBoxled2 = null;
private CheckBox checkBoxled3 = null;
private CheckBox checkBoxled4 = null;
class MyButtonListener implements View.OnClickListener{
@Override
public void onClick(View v) {
ledon =!ledon;
if(ledon) {
button.setText("ALL OFF");
checkBoxled1.setChecked(true);
checkBoxled2.setChecked(true);
checkBoxled3.setChecked(true);
checkBoxled4.setChecked(true);
}
else {
button.setText("ALL ON");
checkBoxled1.setChecked(false);
checkBoxled2.setChecked(false);
checkBoxled3.setChecked(false);
checkBoxled4.setChecked(false);
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.BUTTON);
checkBoxled1 = (CheckBox) findViewById(R.id.LED1);
checkBoxled2 = (CheckBox) findViewById(R.id.LED2);
checkBoxled3 = (CheckBox) findViewById(R.id.LED3);
checkBoxled4 = (CheckBox) findViewById(R.id.LED4);
button.setOnClickListener(new MyButtonListener());
/*
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
ledon =!ledon;
if(ledon)
button.setText("ALL OFF");
else
button.setText("ALL ON");
}
});*/
}
}
- 要想控制复选框,首先实例化复选框的对象,先定义,然后调用findId实例化对象
- Ctrl+shift+空格 自动补全强制转换类型
- 要控制复选框需要对应的id,修改xml文件,增加复选框id
2.2.6 单独操作复选框调用对应的方法
我们想通过选中复选框,操作对应的led亮灭,也就是对应控制led的方法,怎么通过操作复选框,调用对应的方法呢?
- CheckBox用法
选择CheckBox 按shift+F1 跳转到网页,根据说明,设置android:onClick 属性就可以调用对应的方法
file:///C:/androidSDK/sdk1/docs/guide/topics/ui/controls/checkbox.html
- 修改xml文件,增加android:onClick 属性,就表示选择复选框onCheckboxClicked这个方法就会被调用
- MainActivity.java
package com.example.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
boolean ledon = false;
private Button button = null;
private CheckBox checkBoxled1 = null;
private CheckBox checkBoxled2 = null;
private CheckBox checkBoxled3 = null;
private CheckBox checkBoxled4 = null;
class MyButtonListener implements View.OnClickListener{
@Override
public void onClick(View v) {
ledon =!ledon;
if(ledon) {
button.setText("ALL OFF");
checkBoxled1.setChecked(true);
checkBoxled2.setChecked(true);
checkBoxled3.setChecked(true);
checkBoxled4.setChecked(true);
}
else {
button.setText("ALL ON");
checkBoxled1.setChecked(false);
checkBoxled2.setChecked(false);
checkBoxled3.setChecked(false);
checkBoxled4.setChecked(false);
}
}
}
public void onCheckboxClicked(View view) {
// Is the view now checked?
boolean checked = ((CheckBox) view).isChecked();
// Check which checkbox was clicked
switch(view.getId()) {
case R.id.LED1:
if (checked) {
Toast.makeText(getApplicationContext(), "LED1 on", Toast.LENGTH_SHORT).show();// 显示时间较短
}
else{
Toast.makeText(getApplicationContext(), "LED1 off", Toast.LENGTH_SHORT).show();// 显示时间较短
}
break;
case R.id.LED2:
if (checked) {
Toast.makeText(getApplicationContext(), "LED2 on", Toast.LENGTH_SHORT).show();// 显示时间较短
}
else{
Toast.makeText(getApplicationContext(), "LED2 off", Toast.LENGTH_SHORT).show();// 显示时间较短
}
break;
case R.id.LED3:
if (checked) {
Toast.makeText(getApplicationContext(), "LED3 on", Toast.LENGTH_SHORT).show();// 显示时间较短
}
else{
Toast.makeText(getApplicationContext(), "LED3 off", Toast.LENGTH_SHORT).show();// 显示时间较短
}
break;
case R.id.LED4:
if (checked) {
Toast.makeText(getApplicationContext(), "LED4 on", Toast.LENGTH_SHORT).show();// 显示时间较短
}
else{
Toast.makeText(getApplicationContext(), "LED4 off", Toast.LENGTH_SHORT).show();// 显示时间较短
}
break;
// TODO: Veggie sandwich
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.BUTTON);
checkBoxled1 = (CheckBox) findViewById(R.id.LED1);
checkBoxled2 = (CheckBox) findViewById(R.id.LED2);
checkBoxled3 = (CheckBox) findViewById(R.id.LED3);
checkBoxled4 = (CheckBox) findViewById(R.id.LED4);
button.setOnClickListener(new MyButtonListener());
/*
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
ledon =!ledon;
if(ledon)
button.setText("ALL OFF");
else
button.setText("ALL ON");
}
});*/
}
}
- 四个复选框对应一个方法,所以view.getId() 表示哪一个复选框被选中了
- toast是Android系统中一种简易的消息框类型
Toast.makeText(getApplicationContext(), “默认样式的Toast”, Toast.LENGTH_SHORT).show();// 显示时间较短
复习java内部类
interface A {
public void printInfo( );
}
class B implements A {
public void printInfo( ) {
System.out.println("Hello, world!");
}
}
public class Anony {
public static void testFunc(A a) {
a.printInfo( );
}
public static void main(String args[]) {
testFunc(new B());
testFunc(new A() {
public void printInfo() {
System.out.println("Hello, world!");
}
});
}
}
经过以上操作,我们既可以实现这样的逻辑了
- 如果按下ALLON 那么按钮变为ALLOFF
同时勾选4个LED - 如果按下ALLOFF 那么按钮变为ALLON
取消勾选LED - 单独勾选LED