【问题标题】:App crashes when onClick method is called [closed]调用 onClick 方法时应用程序崩溃[关闭]
【发布时间】:2019-07-05 13:06:24
【问题描述】:

我想从手机上阅读短信,但应用程序崩溃了。

public class MainActivity extends AppCompatActivity {

    TextView tx ;
    public static final int MY_PERMISSIONS_REQUEST_CODE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tx = findViewById(R.id.text);


    }
    public void grant(View view) {
        if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_SMS ) == PackageManager.PERMISSION_GRANTED)
        {
            Toast.makeText(this, "Permission is granted", Toast.LENGTH_SHORT).show();
        }
        else
        {
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_SMS},MY_PERMISSIONS_REQUEST_CODE);
        }
    }

    public void show(View view)
    {


        Uri uri = Uri.parse("content://sms/inbox");
        final Cursor cur = getContentResolver().query(uri,
                null, null, null, null);
        String sms = "";
        while (cur.moveToNext()) {
            sms += "From :" + cur.getString(1) + " : " + cur.getString(3)+"\n";
        }
        tx.setText(sms);
        setContentView(view);
    }

错误信息:

Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
        at android.view.View.performClick(View.java:7339) 
        at android.widget.TextView.performClick(TextView.java:14221) 
        at android.view.View.performClickInternal(View.java:7305) 
        at android.view.View.access$3200(View.java:846) 
        at android.view.View$PerformClick.run(View.java:27787) 
        at android.os.Handler.handleCallback(Handler.java:873) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7058) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 
     Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        at android.view.ViewGroup.addViewInner(ViewGroup.java:5259)
        at android.view.ViewGroup.addView(ViewGroup.java:5090)
        at android.view.ViewGroup.addView(ViewGroup.java:5030)
        at android.view.ViewGroup.addView(ViewGroup.java:5003)
        at android.support.v7.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:460)
        at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:145)
        at com.example.final_project.MainActivity.show(MainActivity.java:76)

【问题讨论】:

  • 欢迎来到 Stack Overflow!我们不是调试服务。请阅读How to Askminimal reproducible example,然后阅读edit 相应的问题。仅转储您的代码和错误对我们的志愿者不太礼貌,因此请说明代码的作用、错误发生的位置以及您为解决此问题所做的尝试。

标签: android permissions


【解决方案1】:

摆脱第二个setContentView()

    tx.setText(sms);
    setContentView(view);  // <<- here
}

应该只调用setContentView() 来设置活动的布局,您已经在onCreate() 中设置了该布局。因此,传递给show(View)View 对象已经有一个父对象,因为它已经被膨胀了,因此如果不与它的原始父对象分离就不能重用。如果此方法充当OnClickListener 接口,我假设此View 是您单击的按钮

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多