Android Studio中如何在AlertDialog的TextView显示int类型分数
问题:AlertDialog内的TextView无法显示分数
我希望在计时结束后,通过AlertDialog里的TextView显示当前分数,但试了好几种方法都没成功。以下是我的代码和尝试过的方案:
Main2Activity代码
public class Main2Activity extends AppCompatActivity { int score; TextView scoreText, scoreTextt; AppCompatButton btn_success; AlertDialog.Builder builderDialog; AlertDialog alertDialog; SharedPreferences preferences; // 注:原代码中timeText、imageArray、handler、runnable未定义,需确保已正确声明 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); score = 0; SharedPreferences myScore = this.getSharedPreferences("current_score", MODE_PRIVATE); score = myScore.getInt("current_score", score); } // 假设这是CountDownTimer的回调方法 @Override public void onTick(long millisUntilFinished) { TextView timeText = (TextView) findViewById(R.id.textTime); timeText.setText("Zaman : " + millisUntilFinished / 1000); } @Override public void onFinish() { TextView timeText = (TextView) findViewById(R.id.textTime); timeText.setText("Süre Doldu ! "); // handler.removeCallbacks(runnable); // 需确保handler和runnable已初始化 // 假设imageArray已初始化 for (ImageView image : imageArray) { image.setVisibility(View.INVISIBLE); } if (score < 10){ // 此处重启当前Activity的Intent可移除,无需重复启动 // Intent intent = new Intent(getApplicationContext(), Main2Activity.class); // intent.putExtra("SCORE", score); showAlertDialog(R.layout.my_success_dialog); } else if (score >= 10){ Intent intent = new Intent(Main2Activity.this, Main5Activity.class); startActivity(intent); } } // 显示AlertDialog的方法 private void showAlertDialog(int myLayout){ builderDialog = new AlertDialog.Builder(this); View layoutView = getLayoutInflater().inflate(myLayout,null); builderDialog.setMessage("asd" + score); AppCompatButton dialogButton = layoutView.findViewById(R.id.buttonTamam); builderDialog.setView(layoutView); builderDialog.setCancelable(false); alertDialog = builderDialog.create(); alertDialog.show(); dialogButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { alertDialog.dismiss(); } }); } // 增加分数的方法 public void skoruArttır(View view){ scoreText = (TextView) findViewById(R.id.textScore); score++; scoreText.setText("Skor: " + score); SharedPreferences myScore = getSharedPreferences("current_score", MODE_PRIVATE); SharedPreferences.Editor editor = myScore.edit(); editor.putInt("current_score", score); editor.apply(); } }
my_success_dialog.xml布局
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Main2Activity"> <RelativeLayout android:id="@+id/relativeLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:background="@color/colorPrimary" app:layout_constraintBottom_toTopOf="@+id/textView3" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <ImageView android:layout_width="50dp" android:layout_height="50dp" android:layout_centerInParent="true" android:background="@drawable/baseline_check_circle_24" /> </RelativeLayout> <TextView android:id="@+id/textView3" android:layout_width="370dp" android:layout_height="87dp" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:layout_marginBottom="16dp" android:text="Success" android:textAlignment="center" app:layout_constraintBottom_toTopOf="@+id/txt_success" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.444" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/relativeLayout" /> <TextView android:id="@+id/txt_success" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:text="Skor : " android:textAlignment="center" android:textAppearance="@style/TextAppearance.AppCompat.Large" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView3" tools:ignore="MissingConstraints" /> <androidx.appcompat.widget.AppCompatButton android:id="@+id/buttonTamam" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:text="Okey" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.123" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txt_success" /> <androidx.appcompat.widget.AppCompatButton android:id="@+id/buttonOk2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:text="Ok" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.872" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/txt_success" /> </androidx.constraintlayout.widget.ConstraintLayout>
尝试过的方法
- 在分数增加的方法中设置TextView:
scoreTextt = (TextView) findViewById(R.id.txtsuccess); scoreTextt.setText("Skor: " + score); - 使用未达到10分的SharedPreferences;
- 创建单独的public方法
increasingScore()。
解决方案
问题核心:通过Activity的findViewById无法获取AlertDialog布局内的控件——Dialog的布局是独立于Activity布局的,必须从inflate出来的Dialog布局视图中查找控件。
修改showAlertDialog方法,在inflate布局后找到txt_success并设置分数:
private void showAlertDialog(int myLayout){ builderDialog = new AlertDialog.Builder(this); View layoutView = getLayoutInflater().inflate(myLayout,null); // 关键步骤:从Dialog的布局视图中获取目标TextView TextView dialogScoreView = layoutView.findViewById(R.id.txt_success); dialogScoreView.setText("Skor : " + score); // 设置当前分数 AppCompatButton dialogButton = layoutView.findViewById(R.id.buttonTamam); builderDialog.setView(layoutView); builderDialog.setCancelable(false); alertDialog = builderDialog.create(); alertDialog.show(); dialogButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { alertDialog.dismiss(); } }); }
额外说明:
- 原代码中
builderDialog.setMessage("asd" + score)会被setView(layoutView)覆盖,设置Message无效,直接操作Dialog布局内的TextView即可。 onFinish中重启Main2Activity的Intent可移除,无需重复启动当前Activity。
内容的提问来源于stack exchange,提问作者Twitch Arşivim
相关产品推荐
相关产品推荐

