实验:Android案例——小宝宝装备选择

一、运行效果

1、运行程序,进入如下图显示界面:

实验:Android案例——小宝宝装备选择_第1张图片

2、输入用户名和密码,点击登录,进入下图界面:

实验:Android案例——小宝宝装备选择_第2张图片
这时小宝宝的上方会显示刚刚你登录的用户名,证明是你的宝宝。。
3、点击主人购买装备,进入下图界面:
实验:Android案例——小宝宝装备选择_第3张图片
选择你购买的商品,商品的属性值是不一样的,第一次先选择金剑。。
4、点击购买金剑,进入下图界面:
实验:Android案例——小宝宝装备选择_第4张图片
宝宝的属性值会根据商品的属性值而增加,
再点击一次主人购买装备,选择盔甲。。
5、点击购买盔甲,进入下图界面:
实验:Android案例——小宝宝装备选择_第5张图片
宝宝的属性值根据盔甲的属性值而增加。。

二、设计思路

  1、先创建每个界面对应的layout布局文件
  2、再创建每个布局对应的class类,编写界面交互代码
  3、然后在清单文件中配置每个Activity
  4、最后,运行程序

三、用到的布局文件和class类文件

实验:Android案例——小宝宝装备选择_第6张图片

四、具体实现过程代码

1、登录界面布局文件(activity_login.xml)具体代码如下所示:


   
       
       
   
    
        
        
    
    
2、小宝宝属性显示界面(activity_main.xml)具体代码如下所示:



    
    
    
        
        
            
            
            
        
        
        
            
            
            
        
        
        
            
            
            
        
    
    
        
3、商店界面布局文件(activity_shop.xml)具体代码如下所示:


    
    
    
        
            
        
        
            
            
            
            
4、创建实体类ItemInfo,用于封装装备信息,具体代码如下所示:
import java.io.Serializable;

public class ItemInfo implements Serializable {
    private String name;
    private int acctack;
    private int life;
    private int speed;
    public ItemInfo(String name, int acctack, int life, int speed) {
        this.name = name;
        this.acctack = acctack;
        this.life = life;
        this.speed = speed;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAcctack() {
        return acctack;
    }
    public void setAcctack(int acctack) {
        this.acctack = acctack;
    }
    public int getLife() {
        return life;
    }
    public void setLife(int life) {
        this.life = life;
    }
    public int getSpeed() {
        return speed;
    }
    public void setSpeed(int speed) {
        this.speed = speed;
    }
    public String toString() {
        return "[name=" + name + ",acctack=" + acctack + ",life=" + life + ",speed=" + speed + "]";
    }
}
注: Intent除了传递基本数据类型之外,也能传递Serializable或Parcelable类型的数据。为了方便数据传递,这里让ItemInfo类实现Serializable
5、LoginActivity用来得到用户名的信息,点击登录时,调用MainActivity,并将用户名信息传递过去,具体代码如下所示:
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
    }
    public void gomain(View v){
        String str= ((TextView)findViewById(R.id.et1)).getText().toString();
        Intent intent=new Intent(this,MainActivity.class);
        intent.putExtra("username",str);
        startActivity(intent);
    }
}
6、MainActivity主要是响应按钮的点击事件,并将返回的装备信息显示到指定的控件中,具体代码如下所示:
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private ProgressBar pb1;
    private ProgressBar pb2;
    private ProgressBar pb3;
    private TextView tv_main_life;
    private TextView tv_main_atk;
    private TextView tv_main_speed;
    private TextView main_tv_1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //显示username
        Intent intent1=getIntent();
        Bundle bundle=intent1.getExtras();//.getExtras()得到intent所附带的额外数据
        String str=bundle.getString("username");//getString()返回指定key的值
        main_tv_1=(TextView) findViewById(R.id.main_tv_1);//用TextView显示值
        main_tv_1.setText(str+"的小宝宝");
        //(1)找到我们关心的控件
        pb1 = (ProgressBar) findViewById(R.id.progressBar1);
        pb2 = (ProgressBar) findViewById(R.id.progressBar2);
        pb3 = (ProgressBar) findViewById(R.id.progressBar3);

        tv_main_life = (TextView) findViewById(R.id.tv_main_life);
        tv_main_atk = (TextView) findViewById(R.id.tv_main_atk);
        tv_main_speed = (TextView) findViewById(R.id.tv_main_speed);
        //(2)初始化进度条的最大值
        pb1.setMax(1000);
        pb2.setMax(1000);
        pb3.setMax(1000);
    }
    public void click(View v) {
        Intent intent = new Intent(this, ShoppingActivity.class);
        startActivityForResult(intent, 1);
    }
    //当我们开启的Activity 关闭的时候调用这个方法
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //(1)代表数据来源于shoppingActivity 取数据
        ItemInfo info = (ItemInfo) data.getExtras().get("info");
        //(2)更新一下UI
        updateProgressBar(info);
    }
    //更新当前控件的UI
    private void updateProgressBar(ItemInfo info) {
        //(1)获取当前progressbar的进展
        int progress1 = pb1.getProgress();
        int progress2 = pb2.getProgress();
        int progress3 = pb3.getProgress();
        //(2)更新一下progressbar的进展
        pb1.setProgress(progress1 + info.getLife());
        pb2.setProgress(progress2 + info.getAcctack());
        pb3.setProgress(progress3 + info.getSpeed());
        //更新一下textview的值
        tv_main_life.setText(pb1.getProgress() + "");
        tv_main_atk.setText(pb2.getProgress() + "");
        tv_main_speed.setText(pb3.getProgress() + "");
    }
}
7、ShoppingActivity是用来展示装备信息的,当点击购买ShoppingActivity的装备时,会调回MainActivity并将装备信息回传给MainActivity,具体代码如下所示:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class ShoppingActivity extends Activity {
    ItemInfo info1;
    ItemInfo info2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shop);
        //(1)初始化显示到界面的数据
        info1 = new ItemInfo("金剑", 20, 100, 20);
        info2 = new ItemInfo("盔甲", 35, 200, 40);
        //(2)找到控件 显示数据
        TextView tv_name1 = (TextView) findViewById(R.id.tv_name1);
        TextView tv_life1 = (TextView) findViewById(R.id.tv_life1);
        TextView tv_atk1 = (TextView) findViewById(R.id.tv_atk1);
        TextView tv_speed1 = (TextView) findViewById(R.id.tv_speed1);

        TextView tv_name2 = (TextView) findViewById(R.id.tv_name2);
        TextView tv_life2 = (TextView) findViewById(R.id.tv_life2);
        TextView tv_atk2 = (TextView) findViewById(R.id.tv_atk2);
        TextView tv_speed2 = (TextView) findViewById(R.id.tv_speed2);
        //(3)初始化数据 展示到控件上
        tv_name1.setText(info1.getName());
        tv_atk1.setText("攻击力:" + info1.getAcctack());
        tv_life1.setText("生命力:" + info1.getLife());
        tv_speed1.setText("敏捷度:" + info1.getSpeed());

        tv_name2.setText(info2.getName());
        tv_atk2.setText("攻击力:" + info2.getAcctack());
        tv_life2.setText("生命力:" + info2.getLife());
        tv_speed2.setText("敏捷度:" + info2.getSpeed());
    }

    public void click_1(View v) {
        //(1)获取当前的数据
        Intent intent1 = new Intent();
        intent1.putExtra("info", info1);
        //(2)把结果返回给调用者(mainActivity) 通过onActivityResult方法返回
        setResult(10, intent1);
        finish();
    }
    public void click_2(View v) {
        //(1)获取当前的数据
        Intent intent1 = new Intent();
        intent1.putExtra("info", info2);
        //(2)把结果返回给调用者(mainActivity) 通过onActivityResult方法返回
        setResult(10, intent1);
        finish();
    }
}
8、配置清单文件(Android视图下→app→manifests→AndroidManifest.xml)具体代码如下所示:


    
        
            
                
                
            
        
        
        
    
注:intent-filter”字段所在的activity就是默认启动的第一个activity

五、用到的新知识

1、startActivityForResult与startActivity:
(1)、startActivity( ) 
    仅仅是跳转到目标页面,不能往回跳转,若是想跳回当前页面,则必须再使用一次startActivity( )。
(2)、startActivityForResult( ) 
    可以一次性完成这项任务,当程序执行到这段代码的时候,假若从Activity1跳转到下一个Activity2,而当这个Activity2调用了finish()方法以后,程序会自动跳转回Activity1,并调用前一个Activity1中的onActivityResult( )方法。
2、控件ProgressBar(进度条)的几个常见方法属性:
(1)、style属性:控制ProgressBar的表现形式,水平进度条的属性为:"?android:attr/progressBarStyleHorizontal",环形进 度条属性为:"android:attr/progressBarStyleLarge"
(2)、setMax()方法:设置进度条的最大值
(3)、setProgress()方法:设置当前进度
(4)、getProgress()方法:获取当前进度

注:以上运行效果图为真机运行效果





你可能感兴趣的:(Android)