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
相关产品推荐
相关产品推荐

