每日总结开发简单app

学习的技能/知识 运动 提升 不足
学会了用Android Studio开发简单app 20分钟运动 抵住了手机的诱惑,写了3个小时的作业 因为一些情感原因,一上午的课都在走神,收获很少

使用Android Studio开发app流程

1.下载Android Studio开发工具,并完成相关配置的下载
2.完成了课堂测试任务:做一个建议的地铁计价app
实现代码如下:
activity_main.xml文件的配置,用来对手机界面布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <!-- 起点站选择 -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="起点站:" />

    <Spinner
        android:id="@+id/spinner_start"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:minHeight="48dp" />

    <!-- 终点站选择 -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="终点站:" />

    <Spinner
        android:id="@+id/spinner_end"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:minHeight="48dp" />

    <!-- 购票数量输入 -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="购票数量:" />

    <EditText
        android:id="@+id/editText_quantity"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:minHeight="48dp"
        android:inputType="number"
        android:hint="请输入购票数量"
        android:autofillHints="quantity" />

    <!-- 收费规则 -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="收费规则:每3站收费1元,不足3站按1元收费,起点站不算。" />

    <!-- 立即购票按钮 -->
    <Button
        android:id="@+id/button_buy"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="立即购票"
        android:minHeight="48dp" />

    <!-- 购票结果 -->
    <TextView
        android:id="@+id/textView_result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="18sp"
        android:textColor="#0000FF" />
</LinearLayout>

MainActivity代码实现

package com.example.myapplication;

import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import java.util.*;

public class MainActivity extends AppCompatActivity {
    private Spinner spinnerStart, spinnerEnd;
    private EditText editTextQuantity;
    private TextView textViewResult;

    // 地铁站点图
    private Map<String, Map<String, Integer>> metroGraph;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化组件
        spinnerStart = findViewById(R.id.spinner_start);
        spinnerEnd = findViewById(R.id.spinner_end);
        editTextQuantity = findViewById(R.id.editText_quantity);
        textViewResult = findViewById(R.id.textView_result);
        Button buttonBuy = findViewById(R.id.button_buy);

        // 初始化地铁站点图
        initializeMetroGraph();

        // 获取所有站点名称
        List<String> stations = new ArrayList<>(metroGraph.keySet());
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, stations);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerStart.setAdapter(adapter);
        spinnerEnd.setAdapter(adapter);

        // 立即购票按钮点击事件
        buttonBuy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                calculateAndDisplayResult();
            }
        });
    }

    // 初始化地铁站点图
    private void initializeMetroGraph() {
        metroGraph = new HashMap<>();

        // 添加所有站点
        addStation("西王");
        addStation("时光街");
        addStation("长城桥");
        addStation("和平医院");
        addStation("烈士陵园");
        addStation("新百广场");
        addStation("解放广场");
        addStation("平安大街");
        addStation("北国商城");
        addStation("博物院");
        addStation("体育场");
        addStation("北宋");
        addStation("谈固");
        addStation("朝晖桥");
        addStation("白佛");
        addStation("留村");
        addStation("火炬广场");
        addStation("南村");
        addStation("石家庄东站");
        addStation("洨河大道");
        addStation("西庄");
        addStation("东庄");
        addStation("会展中心");
        addStation("园博园");
        addStation("福泽");

        addStation("柳辛庄");
        addStation("庄窠-铁道大学");
        addStation("义堂");
        addStation("建和桥");
        addStation("长安公园");
        addStation("东里");
        addStation("槐安桥");
        addStation("欧韵公园");
        addStation("元村");
        addStation("西三教");
        addStation("石家庄站");
        addStation("塔坛");
        addStation("汇通路");
        addStation("孙村");
        addStation("塔冢");
        addStation("东王");
        addStation("南王");
        addStation("位同");
        addStation("东二环南路");
        addStation("南位");
        addStation("仓丰路留村");
        addStation("嘉华路");

        addStation("西三庄");
        addStation("高柱");
        addStation("柏林庄");
        addStation("市庄");
        addStation("市二中");
        addStation("东里");
        addStation("槐安桥");
        addStation("西三教");
        addStation("石家庄站");
        addStation("汇通路");
        addStation("孙村");
        addStation("塔冢");
        addStation("东王");
        addStation("南王");
        addStation("位同");
        addStation("东二环南路");
        addStation("西仰陵");
        addStation("中仰陵");
        addStation("南豆");
        addStation("太行南大街");
        addStation("乐乡");

        // 添加连接关系(1号线)
        addConnection("西王", "时光街", 1);
        addConnection("时光街", "长城桥", 1);
        addConnection("长城桥", "和平医院", 1);
        addConnection("和平医院", "烈士陵园", 1);
        addConnection("烈士陵园", "新百广场", 1);
        addConnection("新百广场", "解放广场", 1);
        addConnection("解放广场", "平安大街", 1);
        addConnection("平安大街", "北国商城", 1);
        addConnection("北国商城", "博物院", 1);
        addConnection("博物院", "体育场", 1);
        addConnection("体育场", "北宋", 1);
        addConnection("北宋", "谈固", 1);
        addConnection("谈固", "朝晖桥", 1);
        addConnection("朝晖桥", "白佛", 1);
        addConnection("白佛", "留村", 1);
        addConnection("留村", "火炬广场", 1);
        addConnection("火炬广场", "南村", 1);
        addConnection("南村", "石家庄东站", 1);
        addConnection("石家庄东站", "洨河大道", 1);
        addConnection("洨河大道", "西庄", 1);
        addConnection("西庄", "东庄", 1);
        addConnection("东庄", "会展中心", 1);
        addConnection("会展中心", "园博园", 1);
        addConnection("园博园", "福泽", 1);

        // 添加连接关系(2号线)
        addConnection("柳辛庄", "庄窠-铁道大学", 1);
        addConnection("庄窠-铁道大学", "义堂", 1);
        addConnection("义堂", "建和桥", 1);
        addConnection("建和桥", "长安公园", 1);
        addConnection("长安公园", "北国商城", 1);
        addConnection("北国商城", "博物院", 1);
        addConnection("博物院", "平安大街", 1);
        addConnection("平安大街", "解放广场", 1);
        addConnection("解放广场", "新百广场", 1);
        addConnection("新百广场", "东里", 1);
        addConnection("东里", "槐安桥", 1);
        addConnection("槐安桥", "欧韵公园", 1);
        addConnection("欧韵公园", "元村", 1);
        addConnection("元村", "西三教", 1);
        addConnection("西三教", "石家庄站", 1);
        addConnection("石家庄站", "塔坛", 1);
        addConnection("塔坛", "汇通路", 1);
        addConnection("汇通路", "孙村", 1);
        addConnection("孙村", "塔冢", 1);
        addConnection("塔冢", "东王", 1);
        addConnection("东王", "南王", 1);
        addConnection("南王", "位同", 1);
        addConnection("位同", "东二环南路", 1);
        addConnection("东二环南路", "南位", 1);
        addConnection("南位", "仓丰路留村", 1);
        addConnection("仓丰路留村", "嘉华路", 1);

        // 添加连接关系(3号线)
        addConnection("西三庄", "高柱", 1);
        addConnection("高柱", "柏林庄", 1);
        addConnection("柏林庄", "市庄", 1);
        addConnection("市庄", "市二中", 1);
        addConnection("市二中", "新百广场", 1);
        addConnection("新百广场", "东里", 1);
        addConnection("东里", "槐安桥", 1);
        addConnection("槐安桥", "西三教", 1);
        addConnection("西三教", "石家庄站", 1);
        addConnection("石家庄站", "汇通路", 1);
        addConnection("汇通路", "孙村", 1);
        addConnection("孙村", "塔冢", 1);
        addConnection("塔冢", "东王", 1);
        addConnection("东王", "南王", 1);
        addConnection("南王", "位同", 1);
        addConnection("位同", "东二环南路", 1);
        addConnection("东二环南路", "西仰陵", 1);
        addConnection("西仰陵", "中仰陵", 1);
        addConnection("中仰陵", "南豆", 1);
        addConnection("南豆", "太行南大街", 1);
        addConnection("太行南大街", "乐乡", 1);
    }

    // 添加站点
    private void addStation(String station) {
        metroGraph.put(station, new HashMap<>());
    }

    // 添加连接关系
    private void addConnection(String station1, String station2, int distance) {
        metroGraph.get(station1).put(station2, distance);
        metroGraph.get(station2).put(station1, distance);
    }

    // 计算票价并显示结果
    private void calculateAndDisplayResult() {
        String startStation = spinnerStart.getSelectedItem().toString();
        String endStation = spinnerEnd.getSelectedItem().toString();

        if (startStation.equals(endStation)) {
            textViewResult.setText("请选择不同的起点站和终点站!");
            return;
        }

        // 计算最短路径
        int shortestDistance = findShortestPath(startStation, endStation);

        if (shortestDistance == -1) {
            textViewResult.setText("无法找到路径!");
            return;
        }

        // 计算票价
        int pricePerTicket = (shortestDistance / 3) + (shortestDistance % 3 == 0 ? 0 : 1);
        if (pricePerTicket < 1) {
            pricePerTicket = 1; // 至少1元
        }

        // 获取购票数量
        int quantity = 1;
        try {
            quantity = Integer.parseInt(editTextQuantity.getText().toString());
            if (quantity <= 0) {
                textViewResult.setText("购票数量必须大于0!");
                return;
            }
        } catch (NumberFormatException e) {
            e.printStackTrace();
            textViewResult.setText("请输入有效的购票数量!");
            return;
        }

        // 计算总金额
        int totalPrice = pricePerTicket * quantity;

        // 显示结果
        textViewResult.setText("购票成功!最短路径:" + shortestDistance + "站,总金额:" + totalPrice + "元");
    }

    // Dijkstra算法计算最短路径
    private int findShortestPath(String start, String end) {
        Map<String, Integer> distances = new HashMap<>();
        for (String station : metroGraph.keySet()) {
            distances.put(station, Integer.MAX_VALUE);
        }
        distances.put(start, 0);

        PriorityQueue<String> queue = new PriorityQueue<>(Comparator.comparingInt(distances::get));
        queue.add(start);

        while (!queue.isEmpty()) {
            String current = queue.poll();
            if (current.equals(end)) {
                return distances.get(current);
            }

            for (Map.Entry<String, Integer> neighbor : metroGraph.get(current).entrySet()) {
                String nextStation = neighbor.getKey();
                int newDistance = distances.get(current) + neighbor.getValue();
                if (newDistance < distances.get(nextStation)) {
                    distances.put(nextStation, newDistance);
                    queue.add(nextStation);
                }
            }
        }

        return -1; // 无法到达
    }
}

效果展示

app下载链接
下载安装包

posted @ 2025-03-15 00:47  七分之一月  阅读(24)  评论(0)    收藏  举报
//雪花飘落效果