Activity交互功能实现
APP图标,名字,版本号
修改APP的图标在AndroidManifest.xml文件里。
修改图标处在icon android:icnotallow="@mipmap/ic_launcher"
用户可以把自己要设定的图标加入到左侧文件栏中的mipmap中,hdpi,mdpi,xhdpi,xxhdpi,xxxhdpi分别代表不同分辨率的图标,用户可以把图标做成不同分辨率格式加入到文件夹中。方便适应不同手机的分辨率。图片最好为png格式,jpg格式可能会导致出错。
label 即APP名字, 可以直接在双引号中输入,也可以在values->strings中声明,然后再引用。
版本号在app目录下的build.gradle中修改,里面的versionName 即版本号,如下:
AndroidManifest.xml 和 build.gradle文件中的代码谨慎修改,修改时建议标记,不然可能出现意想不到的bug,却找不到错在哪。
设置APP启动页面
APP启动页面,在显示1秒钟之后自动跳转到APP首页。
首先按照第一章中说的新建一个Java Class文件,起名为SplashActivity.java文件,并关联一个布局文件activity_splash.xml。 布局文件可以按照自己的需要修改。注意在AndroidManifest.xml文件中添加如下代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.firstproject">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
</activity>
<activity android:name=".FirstActivity">
</activity>
<activity android:name=".SplasgActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
添加的代码是:
<activity android:name=".SplasgActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
**intent-filter是将界面设置为最先打开。**即点击APP桌面图标后首先进入的界面。只能有一个。
以下设置APP启动页面启动1秒后跳转的APP首页。代码如下:
package com.example.firstproject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.annotation.Nullable;
public class SplasgActivity extends Activity {
Handler mHandler = new Handler();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent =new Intent(SplasgActivity.this,MainActivity.class);
startActivity(intent);
}
},1000);
}
}
这里handler中的postDelayerd主要用来实现1秒后页面自动跳转。 run()里面也需要Intent意图。和Button点击跳转事件一样。
1000表示1秒,类似可以设置其他事件。
Button点击事件
点击显示文字
首先创建一个Java project 项目,在activity_main.xml布局文件中加入几个button和TextView,并设定相应的id。
在MainActivity.java文件中输入以下代码:
package com.example.firstproject;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"啊,我被击中了",Toast.LENGTH_LONG).show();
}
});
}
}
核心代码:
findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"啊,我被击中了",Toast.LENGTH_LONG).show();
}
});
findViewById 即通过id找到这个View控件,然后设置点击响应事件。Toast即弹出一个短暂的消息,消息提示我被点击了。
点击跳转界面
在activity_splash.xml布局文件中加入一个Button, 并且设置id为splash_button.如图:
在SplashActivity.java文件中加入如下代码:
package com.example.firstproject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class SplasgActivity extends Activity {
private Button mEnterButton;
private View.OnClickListener mOnClickListener= new View.OnClickListener(){
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.splah_button:
Intent intent =new Intent(SplasgActivity.this,MainActivity.class);
startActivity(intent);
break;
}
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
mEnterButton=findViewById(R.id.splah_button);
mEnterButton.setOnClickListener(mOnClickListener);
}
}
另一种设置点击事件的方式。上面的代码实现了从SplashActivity跳转到MainActivity,下面代码实现从MainAcitivity跳转到SplashActivity。代码如下:
package com.example.firstproject;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,FirstActivity.class);
startActivity(intent);
}
});
}
}
实现button的点击事件,比较推荐第一种方法,适合button比较多的情况。
实现页面之间的传值
传递字符串
这里实现从MainActivity.java 获取一个数值,在点击button跳转时将数值传给FirstAcitivity.java。
在MainActivity中的传值代码为(这段代码写在onCreate中):
TextView textView=findViewById(R.id.button_first);
final String title=textView.getText().toString();
findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,FirstActivity.class);
intent.putExtra("title",title);
startActivity(intent);
}
});
首先需要用findViewById找到需要获取的View控件的id。再用getText获取控件中的内容,再转换成String。在Intent中用putExtra将内容传送。
在FirstActivity中获取数值的代码如下:
public class FirstActivity extends AppCompatActivity {
TextView text;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Intent intent=getIntent();
text=(TextView) findViewById(R.id.edt_test);
text.setText(intent.getStringExtra("data"));
}
}
获取意图,再找到用来展示内容的控件id,最后设置text。
传递对象
这里以UserInfo为例。
新建一个Java Class,名为:UserInfo
UserInfo中代码如下:
package com.example.firstproject;
import java.io.Serializable;
public class UserInfo implements Serializable {
private String mUserName;
private int mAge;
public UserInfo(String mUserName, int mAge) {
this.mUserName = mUserName;
this.mAge = mAge;
}
public String getmUserName() {
return mUserName;
}
public int getmAge() {
return mAge;
}
public void setmUserName(String mUserName) {
this.mUserName = mUserName;
}
public void setmAge(int mAge) {
this.mAge = mAge;
}
}
然后在之前的MainActivity中加入如下几行代码。在点击button_first时将userInfo中的对象传递给FirstAcitivity,同样用Intent中的putExtra。
代码如下:
findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
UserInfo userInfo= new UserInfo("小明",23);
Intent intent=new Intent(MainActivity.this,FirstActivity.class);
intent.putExtra("title",title);
intent.putExtra("userInfo",userInfo);
startActivity(intent);
}
});
在FirstActivity中获取传递的对象,方法和获取传递的字符串类似,代码如下:
text=(TextView) findViewById(R.id.text_first);
text2=findViewById(R.id.text_second);
UserInfo userInfo = (UserInfo)intent.getSerializableExtra("userInfo");
text2.setText("名字是"+userInfo.getmUserName());
text.setText(intent.getStringExtra("data"));
UserInfo可以用来存放一个对象的属性,也就是C++中的类。
传回数据
这里实现从MainActivity跳转到FirstActivity,再从FirstActivity回到之前的MainActivity,并传回值。
第一步将MainActivity中的startA
完整代码(MainActivity):
package com.example.firstproject;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
public static final String TITLE = "title";
public static final String USER_INFO = "userInfo";
public static final int REQUEST_CODE=9999;
private static final String TAG= SplasgActivity.class.getSimpleName();
private TextView mtextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mtextView=findViewById(R.id.button_first);
final String title=mtextView.getText().toString();
findViewById(R.id.button_first).setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
UserInfo userInfo= new UserInfo("小明",23);
Intent intent=new Intent(MainActivity.this,FirstActivity.class);
intent.putExtra(TITLE,title);
intent.putExtra(USER_INFO,userInfo);
startActivityForResult(intent,REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i(TAG,"requestCode:"+requestCode+"resultCode"+resultCode);
if(requestCode == REQUEST_CODE && resultCode == FirstActivity.RESULT_CODE){
if(data!=null){
String title=data.getStringExtra("title");
mtextView.setText(title);
}
}
}
}
FirstActivity代码:
package com.example.firstproject;
import android.content.Intent;
import android.os.Bundle;
import android.os.IInterface;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class FirstActivity extends AppCompatActivity {
TextView text,text2;
public static final int RESULT_CODE=1234;
private View.OnClickListener mOnClickListener= new View.OnClickListener(){
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_back:
Intent intent= new Intent();
intent.putExtra(MainActivity.TITLE,"我是传回来的");
setResult(RESULT_CODE,intent);
finish();
break;
}
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Intent intent=getIntent();
text=(TextView) findViewById(R.id.text_first);
text2=findViewById(R.id.text_second);
Button mbutton=findViewById(R.id.button_back);
mbutton.setOnClickListener(mOnClickListener);
UserInfo userInfo = (UserInfo)intent.getSerializableExtra("userInfo");
text2.setText("名字是"+userInfo.getmUserName());
text.setText(intent.getStringExtra("data"));
}
}
代码解释:
Intent intent=new Intent(MainActivity.this,FirstActivity.class);
intent.putExtra(TITLE,title);
startActivityForResult(intent,REQUEST_CODE);
从MainActivity传递到FirstActivity。并且传递数据title,startActivityForResult 打开意图,并且请求一个result。
FirstActivity中点击button返回MainActivity时,代码:
Intent intent= new Intent();
intent.putExtra(MainActivity.TITLE,"我是传回来的");
setResult(RESULT_CODE,intent);
finish();
重点在于setResult。 呼应之前的startActivityForResult,关联暗号即REQUEST_CODE和RESULT_CODE。 可通过RESULT_CODE判断是从什么控件传回的内容。
下面代码既是通过两个暗号,并且处理返回数据。代码如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.i(TAG,"requestCode:"+requestCode+"resultCode"+resultCode);
if(requestCode == REQUEST_CODE && resultCode == FirstActivity.RESULT_CODE){
if(data!=null){
String title=data.getStringExtra("title");
mtextView.setText(title);
}
}
}
这个传回数据的代码非常关键,需要再多使用。理解。