You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio支付页根据支付方式动态显隐控件功能实现问题

解决方案

第一步:调整布局文件(activity_payment_activty.xml)

你需要先修改布局,新增二维码控件,同时给现金支付专属的内容加统一父布局方便控制显隐,修改参考如下:

  • 把原来的现金输入框用FrameLayout包裹,新增二维码ImageView,默认隐藏
  • 把找零模块、数字键盘、计算按钮等现金支付才需要的内容,全部放进一个id为ll_cash_pay_content的父布局里

布局示例代码:

<!-- 现金/二维码切换区域 -->
<FrameLayout
    android:id="@+id/fl_cash_area"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/et_cash"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:hint="Enter cash"
        android:gravity="center_vertical"/>
    <!-- 二维码控件,默认隐藏 -->
    <ImageView
        android:id="@+id/iv_qr_code"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:src="@drawable/你的二维码图片资源名"
        android:visibility="gone"/>
</FrameLayout>

<!-- 现金支付专属内容父布局 -->
<LinearLayout
    android:id="@+id/ll_cash_pay_content"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <!-- 原来的找零CHANGE模块、所有数字键盘按钮、btn_calculate按钮都放到这个布局里 -->
</LinearLayout>

第二步:修改PaymentActivity.java代码

你只需要给支付方式选择的Spinner加选中监听,根据选中项控制对应控件的显隐即可,修改后的完整代码如下,改动部分已标注:

package com.tankarjian.it212n.a2910assingment;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.tankarjian.it212n.a2910assingment.roomDb.database.MyDb;
import com.tankarjian.it212n.a2910assingment.roomDb.database.TransactionRecord;

import java.util.List;

public class PaymentActivity extends AppCompatActivity {
    double totalPrice = 0;
    double totalTax = 0;
    private List<Product> productList;;
    Button button0, button1, button2, button3, button4, button5, button6,
            button7, button8, button9, buttondecimal, buttonclear;
    // 新增声明控件
    private ImageView ivQrCode;
    private TextView etCash;
    private LinearLayout llCashPayContent;

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

        etCash = findViewById(R.id.et_cash);
        // 新增初始化新增的控件
        ivQrCode = findViewById(R.id.iv_qr_code);
        llCashPayContent = findViewById(R.id.ll_cash_pay_content);
        
        button0 = findViewById(R.id.button0);
        button1 = findViewById(R.id.button1);
        button2 = findViewById(R.id.button2);
        button3 = findViewById(R.id.button3);
        button4 = findViewById(R.id.button4);
        button5 = findViewById(R.id.button5);
        button6 = findViewById(R.id.button6);
        button7 = findViewById(R.id.button7);
        button8 = findViewById(R.id.button8);
        button9 = findViewById(R.id.button9);
        buttondecimal = findViewById(R.id.buttondecimal);
        buttonclear = findViewById(R.id.buttonclear);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "1");
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "2");
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "3");
            }
        });
        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "4");
            }
        });
        button5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "5");
            }
        });
        button6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "6");
            }
        });
        button7.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "7");
            }
        });
        button8.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "8");
            }
        });
        button9.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "9");
            }
        });
        button0.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + "0");
            }
        });
        buttonclear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText("");
            }
        });
        buttondecimal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                etCash.setText(etCash.getText() + ".");
            }
        });


        if (getIntent() != null) {
            totalPrice = getIntent().getDoubleExtra("TOTAL_PRICE", 0);
            totalTax = getIntent().getDoubleExtra("TOTAL_TAX", 0);
            productList = (List<Product>) getIntent().getSerializableExtra("LIST");
        }

        TextView tvTotalAmount = findViewById(R.id.tv_total_amount);
        tvTotalAmount.setText(String.valueOf(totalPrice + totalTax));

        Spinner spinner1 = findViewById(R.id.spinner1);

        ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(PaymentActivity.this,
                android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.spinner));
        myAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner1.setAdapter(myAdapter);

        // 新增支付方式选择监听
        spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String selectedPayType = parent.getItemAtPosition(position).toString();
                if ("QR Payment".equals(selectedPayType)) {
                    // QR支付:展示二维码,隐藏现金输入框和现金支付专属内容
                    ivQrCode.setVisibility(View.VISIBLE);
                    etCash.setVisibility(View.GONE);
                    llCashPayContent.setVisibility(View.GONE);
                } else if ("Cash payment".equals(selectedPayType)) {
                    // 现金支付:隐藏二维码,展示现金输入框和现金支付专属内容
                    ivQrCode.setVisibility(View.GONE);
                    etCash.setVisibility(View.VISIBLE);
                    llCashPayContent.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // 默认走现金支付逻辑
                ivQrCode.setVisibility(View.GONE);
                etCash.setVisibility(View.VISIBLE);
                llCashPayContent.setVisibility(View.VISIBLE);
            }
        });

        findViewById(R.id.btn_calculate).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String cashString = etCash.getText().toString();
                if (cashString != null && !cashString.isEmpty()) {
                    double cash = Double.parseDouble(cashString);
                    if (cash >= totalPrice) {
                        double payableAmount = cash - totalPrice - totalTax;
                        TextView tvPayable = findViewById(R.id.tv_return_amount);
                        tvPayable.setText(String.valueOf(payableAmount));
                        saveTransactionToDatabase();
                    } else {
                        Toast.makeText(PaymentActivity.this, "Please enter the cash more than amount", Toast.LENGTH_SHORT).show();
                    }
                } else
                    Toast.makeText(PaymentActivity.this, "Please enter an amount", Toast.LENGTH_SHORT).show();

            }
        });
        findViewById(R.id.btn_history).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(PaymentActivity.this, HistoryActivity.class));
            }
        });

    }

    private void saveTransactionToDatabase() {
        long date = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();
        if (productList != null)

            for (int i = 0; i < productList.size(); i++) {
                sb.append(productList.get(i).name);
                sb.append(" ,");
            }

        TransactionRecord transactionRecord = new TransactionRecord(sb.toString(), date, String.valueOf(totalPrice));
        MyDb myDb = MyDb.getInstance(PaymentActivity.this);
        myDb.myDao().addRecord(transactionRecord);
    }
}

注意事项

  • 代码里的"QR Payment"和"Cash payment"要和你strings.xml里spinner数组的支付方式字符串完全一致,否则判断会失效
  • 你需要提前把二维码图片放到res/drawable目录下,替换布局里的@drawable/你的二维码图片资源名
  • 如果你需要动态生成二维码,可以引入ZXing等开源库生成对应支付金额的二维码,替换ImageView的内容即可

内容的提问来源于stack exchange,提问作者user17088449

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:54:02