版权声明:有问题请联系邮箱 [email protected] https://blog.csdn.net/qq_38066103/article/details/84641332
初学Android移动开发,先从一个简单的项目开始——简易计算器。
前言:
如果你在Android studio配置方面有什么错误,可以参考我的其他博客。这里只是写一下我作为一个初学者的开发笔记,总结自己的得失,为以后的开发打基础。对你有帮助的地方请自取。
目录
开发过程中的笔记:
- 关于.xml
- 在开发一个项目的时候,首先要设计好 *.xml 界面的布局显示:*.xml界面总体布局结构使用到的有TableLayout(表格布局)、LinearLayout(线性布局)——分为垂直线性布局(android:orientation="vertical")和水平线性布局 (android:orientation="horizontal")。
- 在TableLayout(表格布局)中,如果一行有多个控件,使用<TableRow>,把要放在一行的控件放在一个<TableRow>之中,可以自动实现对齐等效果。
- <TextView>标签一般用于显示的控件,不对其进行操作,运行之后也无法标签里边的更改内容。而<EditText>则是允许输入的输入框,接收字符串和整型数字等,在新版的Android studio中控件<EditText>不会自动适应长度,需要通过android:ems="10" 来改变长度。PS:有些控件在可拖拽的Palette的控件列表中无法找到,但可以使用。
- 需要获取数据的控件,或者需要通过代码来控制显示信息的控件,需要给控件自定义id,android:id="@+id/StringName",在*Activity.java 的类中,定义变量,并在onCreate()中通过findViewById()方法来调用,例如
private EditText firstText;
private EditText secondText;
private TextView calculateTypeText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firstText = (EditText) this.findViewById(R.id.firstNumber);
secondText = (EditText)this.findViewById(R.id.secondNumber);
calculateTypeText = (TextView) this.findViewById(R.id.calculateTypeText);
}
- 关于*Activity.java
- 需要导入引用的的import ,会在创建变量的时候自动添加引用。
- 需要的操作*.xml的变量,都要去定义,定义分为私有private、公有public、保护protected三种,按照需求自行定义。对于定义变量的赋值,即找到变得所对应的id,需要在onCreate()中通过方法实现。如上☝
- 每一种操作都要有一个方法监听,比如点击事件,单选框改变事件等。新建一个事件之后要对这个事件的函数复写,即事件的具体操作和执行。
- Intent 是一个用于各个界面之间数据交换和传递的类,Bundle也是一个用于个界面数据交换和传递的类。不同点举个栗子:现在我要把值通过A经过B传给C。如果用Intent的话 A到B先写一遍, 再在B中都取出来 ,然后再把值放到Intent中 ,再跳到C,C才能收到数据。如果我在A中用了 Bundle 的话 ,我把Bundle传给B ,在B中再转传到C, C就可以直接获取到值。这样的话 还有一个好处: 就是在B中 还可以给Bundle对象添加新的 key - value ,同样可以在C中取出来。
代码目录结构:
对于伸手党,最难过的莫过于只有代码,没有一个具体的大纲一样的目录结构。所以,习惯伸手的我,给习惯伸手的你一个便利。
源代码:
MainActivity.java:
package com.felix.felix.pro_calculator;
import android.content.Intent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.w3c.dom.Text;
public class MainActivity extends AppCompatActivity {
private EditText firstText;
private EditText secondText;
private TextView calculateTypeText;
private int firstNumber = 0;
private int secondNumber =0;
private Button chooseButton;
private Button calculateButton;
private int requestCode= 0;
private int calculationType= -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firstText = (EditText) this.findViewById(R.id.firstNumber);
secondText = (EditText)this.findViewById(R.id.secondNumber);
calculateTypeText = (TextView) this.findViewById(R.id.calculateTypeText);
chooseButton =(Button)this.findViewById(R.id.chooseButton);
calculateButton=(Button)this.findViewById(R.id.calculateButton);
//定义一个点击事件,点击跳转界面
chooseButton.setOnClickListener(new ChooseButtonListener());
calculateButton.setOnClickListener(new CalculateButtonListener());
}
//对于点击事件的类和函数复写
class ChooseButtonListener implements View.OnClickListener{
@Override
public void onClick(View arg0) {
//跳转界面的具体实现
Intent intent = new Intent(MainActivity.this,CalculationTypeActivity.class);
//带着其它界面的信息返回本界面。requestCode 是本界面的标识
MainActivity.this.startActivityForResult(intent,requestCode);
}
}
class CalculateButtonListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,ResultActivity.class);
intent.putExtra("firstNumber",firstText.getText().toString());
intent.putExtra("secondNumber",secondText.getText().toString());
//计算结果
intent.putExtra("calculationType",calculationType);
int result =0;
firstNumber = Integer.parseInt(firstText.getText().toString());
secondNumber = Integer.parseInt(secondText.getText().toString());
switch (calculationType){
case 1:
result = firstNumber + secondNumber;
break;
case 2:
result = firstNumber - secondNumber;
break;
case 3:
result = firstNumber * secondNumber;
break;
case 4:
result = firstNumber / secondNumber;
break;
default:
result = 1;
break;
}
//带着这个界面的信息去其他界面
intent.putExtra("result",result);
startActivity(intent);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(this.requestCode==requestCode&& CalculationTypeActivity.resultCode==resultCode){
Bundle bundle = data.getExtras();
calculationType = data.getIntExtra("type1",-1);
System.out.println("calculationType:" + calculationType);
calculateTypeText.setText(ConstantInfo.typeMap.get(calculationType));
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="5dp"
android:textSize="14sp"
android:text="简易计算器"
/>
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="第一个数:"
android:textSize="18dp" />
<EditText
android:id="@+id/firstNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:ems="10"
android:hint="请输入第一个数"
android:inputType="number"
android:textSize="14sp" />
</TableRow>
<TableRow>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:textSize="18dp"
android:text="第二个数:"
/>
<EditText
android:id="@+id/secondNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:ems="10"
android:hint="请输入第二个数"
android:inputType="number"
android:textSize="14sp" />
</TableRow>
<TableRow>
<TextView
android:id="@+id/calculateType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:textSize="18dp"
android:text="计算类型:"
/>
<TextView
android:id="@+id/calculateTypeText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:textSize="18dp"
android:text="未选择计算类型"
/>
<Button
android:id = "@+id/chooseButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="-20dp"
android:text="选择"
/>
</TableRow>
<TableRow>
<Button
android:id = "@+id/calculateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="计算"
/>
</TableRow>
</TableLayout>
CalculationTypeActivity.java
package com.felix.felix.pro_calculator;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
public class CalculationTypeActivity extends AppCompatActivity {
private RadioGroup group;
private RadioButton add;
private RadioButton minus;
private RadioButton multiply;
private RadioButton divider;
private Button okBtn;
private int calculationType = -1;
protected static final int resultCode = 0x321;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculation_type);
group = (RadioGroup)this.findViewById(R.id.group);
add = (RadioButton)this.findViewById(R.id.add);
minus = (RadioButton)this.findViewById(R.id.minus);
multiply = (RadioButton)this.findViewById(R.id.multiply);
divider = (RadioButton)this.findViewById(R.id.divider);
okBtn = (Button)this.findViewById(R.id.ok);
group.setOnCheckedChangeListener(new GroupSelectionListener());
okBtn.setOnClickListener(new okLstener());
}
class GroupSelectionListener implements RadioGroup.OnCheckedChangeListener{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//选择的是哪一个按钮
int radioButtonId = group.getCheckedRadioButtonId();
RadioButton btn = (RadioButton)CalculationTypeActivity.this.findViewById(radioButtonId);
//为啥不用switch?
if(btn.getId()==add.getId()){
calculationType=1;
}else if(btn.getId()==minus.getId()){
calculationType=2;
}else if(btn.getId()==multiply.getId()){
calculationType=3;
}else if(btn.getId()==divider.getId()){
calculationType=4;
}
System.out.println("current value:" + calculationType);
}
}
//处理点击时间按钮,并且把信息返回到MainActivity中
class okLstener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent intent = getIntent();
intent.putExtra("type1",calculationType);
Bundle bundle = new Bundle();
bundle.putInt("type",calculationType);
intent.putExtras(bundle);
//把这个activity的值回传回去
CalculationTypeActivity.this.setResult(resultCode,intent);
//把这个界面消掉,让MainActivity出现
CalculationTypeActivity.this.finish();
}
}
}
activity_calculation_type.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="请选择计算类型:"
android:textSize="20dp" />
<RadioGroup
android:id="@+id/group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="vertical"
>
<RadioButton
android:id="@+id/add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加法"
android:textSize="20dp"
/>
<RadioButton
android:id="@+id/minus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="减法"
android:textSize="20dp"
/>
<RadioButton
android:id="@+id/multiply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="乘法"
android:textSize="20dp"
/>
<RadioButton
android:id="@+id/divider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="除法"
android:textSize="20dp"
/>
<Button
android:id="@+id/ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="确定"
/>
</RadioGroup>
</LinearLayout>
ResultActivity.java
package com.felix.felix.pro_calculator;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class ResultActivity extends AppCompatActivity {
private TextView resultText;
private Button back;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
resultText = (TextView)this.findViewById(R.id.resultText);
back = (Button)this.findViewById(R.id.back);
back.setOnClickListener(new BackListener());
Intent intent = this.getIntent();
StringBuilder builder = new StringBuilder();
builder.append(intent.getStringExtra("firstNumber"))
.append(" ")
.append(ConstantInfo.infoMap.get(intent.getIntExtra("calculationType",0)))
.append(" ")
.append(intent.getStringExtra("secondNumber"))
.append(" = ")
.append(intent.getIntExtra("result",-1));
//把结果存入resultText中
resultText.setText(builder.toString());
}
class BackListener implements View.OnClickListener{
@Override
public void onClick(View v) {
Intent intent = new Intent(ResultActivity.this,MainActivity.class);
startActivity(intent);
ResultActivity.this.finish();
}
}
}
activity_result.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="计算结果"
android:textSize="20dp"
/>
<TextView
android:id="@+id/resultText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="40dp"
android:textSize="20dp"
/>
<Button
android:id="@+id/back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="返回"/>
</LinearLayout>
ConstantInfo.java
package com.felix.felix.pro_calculator;
import java.util.HashMap;
import java.util.Map;
/*
Created by Felix on 2018/11/28 21:01
*/
public class ConstantInfo {
public static final String add = "加法";
public static final String minus = "减法";
public static final String multiply = "乘法";
public static final String divider = "除法";
public static final Map<Integer,String> typeMap = new HashMap<Integer,String>();
public static final Map<Integer,String> infoMap = new HashMap<Integer,String>();
static {
typeMap.put(1,add);
typeMap.put(2,minus);
typeMap.put(3,multiply);
typeMap.put(4,divider);
infoMap.put(1,"+");
infoMap.put(2,"-");
infoMap.put(3,"*");
infoMap.put(4,"/");
}
}
转载注明出处。
指教请联系:邮箱 [email protected] QQ:1311665691