Activity交互功能实现

APP图标,名字,版本号

修改APP的图标在AndroidManifest.xml文件里。

android material design控件 交互式toast android交互规范_xml


修改图标处在icon android:icnotallow="@mipmap/ic_launcher"用户可以把自己要设定的图标加入到左侧文件栏中的mipmap中,hdpi,mdpi,xhdpi,xxhdpi,xxxhdpi分别代表不同分辨率的图标,用户可以把图标做成不同分辨率格式加入到文件夹中。方便适应不同手机的分辨率。图片最好为png格式,jpg格式可能会导致出错。

label 即APP名字, 可以直接在双引号中输入,也可以在values->strings中声明,然后再引用。

版本号在app目录下的build.gradle中修改,里面的versionName 即版本号,如下:

android material design控件 交互式toast android交互规范_ide_02


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.如图:

android material design控件 交互式toast android交互规范_xml_03

在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);
        }
    }
}

这个传回数据的代码非常关键,需要再多使用。理解。