【问题标题】:onClickListener crashes the app when Button clicked in Android Studio在 Android Studio 中单击按钮时,onClickListener 会使应用程序崩溃
【发布时间】:2020-04-10 19:14:50
【问题描述】:

我正在尝试制作一个应用程序,其中包含“抱歉!一旦单击按钮崩溃,将打印与用户按钮给出的输入一样多的时间。即使我尝试在 onclicklistener 中设置 Toast,应用程序也不会崩溃,但不会形成 toast。我认为Java文件中存在一些问题。 这是java文件:

    package com.example.satvara.vipul.instantmessage;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class Sorry extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sorry);
        this.setTitle(R.string.activity_sorry);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        EditText editText= findViewById(R.id.editText);
        String str = editText.getText().toString();
        final int i= Integer.parseInt(str);
        final TextView textView=findViewById(R.id.textView);
        Button btn=findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int j=0; j>i;j++){
                    textView.setText("Sorry!");
                }
            }
        });

    }

}

这是 XML 文件:

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Sorry">
    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TableRow>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Number:"
                android:padding="10dp"
                android:textSize="20dp"
                android:textColor="@color/text"
                android:layout_column="1"/>
            <EditText
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:hint="Enter Here"
                android:paddingLeft="7dp"
                android:paddingRight="7dp"
                android:backgroundTint="@color/colorPrimaryDark"
                android:textCursorDrawable="@drawable/cursor_color"
                android:inputType="number"
                android:id="@+id/editText"/>
        </TableRow>
        <TableRow>
            <Button
                android:layout_column="2"
                android:hint="Send via Whatsapp"
                android:id="@+id/btn"
                ></Button>
        </TableRow>
        <TableRow>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/textView">
            </TextView>
        </TableRow>
    </TableLayout>

</android.support.constraint.ConstraintLayout>

【问题讨论】:

    标签: android android-studio onclicklistener


    【解决方案1】:

    您必须将获取编辑文本放入 onClick() 中。你的 for 循环条件是错误的。即使它是正确的,您也只是设置了 i 次相同的文本。您应该只使用循环来设置 yourString 的值,然后在循环结束时使用 setText(yourString)

    public class Sorry extends AppCompatActivity {
        EditText edittext;
        TextView textView;
        Button btn;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_sorry);
                this.setTitle(R.string.activity_sorry);
                getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
                editText= findViewById(R.id.editText);
                textView=findViewById(R.id.textView);
                btn=findViewById(R.id.btn);
    
                btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                     String str = editText.getText().toString();
                     int i= Integer.parseInt(str);
                      String myText="";
                        for (int j=0; j<i;j++){
                            myText=myText.concat("Sorry \n");
                        }
                       textView.setText(myText);
                    }
                });
    
            }
    
        };
    

    【讨论】:

      【解决方案2】:

      问题出在以下几行:

      String str = editText.getText().toString();
      final int i= Integer.parseInt(str);
      

      您的 EditText 尚未在 Activity 的 onCreate 方法中的 UI 上创建。

      在整个 UI 形成之后,你需要通过一些 UI 事件来读取值。

      例如,您可以在单击按钮时读取EditText

          btn.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  String str = editText.getText().toString();
                  int i= Integer.parseInt(str);
      
                  for (int j=0; j>i;j++){
                      textView.setText("Sorry!");
                  }
              }
          });
      

      在上面的代码中,TextView 中的文本将在每次循环后被覆盖。因此,对于 i >= 1 的任何值,您只会看到一个“对不起!”在TextView里面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-15
        • 2017-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多