【问题标题】:Android Runtime Error while executing Application on emulator在模拟器上执行应用程序时出现 Android 运行时错误
【发布时间】:2018-08-22 15:12:15
【问题描述】:

我刚刚开始学习 Android 开发。

在运行我的 android 应用程序时收到以下错误代码。

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.karan.newapp, PID: 3385
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.karan.newapp/com.example.karan.newapp.mainActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                      at android.app.ActivityThread.access$800(ActivityThread.java:151)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5254)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                   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:3936)
                      at android.view.ViewGroup.addView(ViewGroup.java:3786)
                      at android.view.ViewGroup.addView(ViewGroup.java:3758)
                      at com.example.karan.newapp.mainActivity.onCreate(mainActivity.java:26)
                      at android.app.Activity.performCreate(Activity.java:5990)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:135) 
                      at android.app.ActivityThread.main(ActivityThread.java:5254) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

这是我的代码示例。 请在下面帮助我。

package com.example.karan.newapp;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;
import android.widget.Button;
import android.graphics.Color;
public class mainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        RelativeLayout myLayout = new RelativeLayout(this);
        Button myButton = new Button(this);
        myLayout.addView(myButton);
        myLayout.setBackgroundColor(Color.BLUE);
        myButton.setBackgroundColor(Color.YELLOW);
        myButton.setText(R.string.myButton);
        RelativeLayout.LayoutParams buttonDetails =
               new  RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT,
                    RelativeLayout.LayoutParams.WRAP_CONTENT
                );
        buttonDetails.addRule(RelativeLayout.CENTER_HORIZONTAL);
        buttonDetails.addRule(RelativeLayout.CENTER_VERTICAL);
        myLayout.addView(myButton,buttonDetails);
        setContentView(myLayout);
    }
}
..................................................... ..................................................... ..................................................... ..................................................... ..................................................... ..................................................... ..................................................... ..................................................... ..................................................... .........................................

【问题讨论】:

  • 这里有太多WAY的问题。再次阅读 Android 应用开发的基础知识。
  • 另外,Javascript 标签不属于这个问题。
  • 欢迎来到 Stack Overflow!请带上tour 并通读help center,特别是如何提问。你最好的选择是做你的研究,搜索关于 SO 的相关主题,然后试一试。在进行更多研究和搜索后,发布您的尝试Minimal, Complete, and Verifiable example,并具体说明您遇到的问题,这可以帮助您获得更好的答案。

标签: java android android-layout android-studio


【解决方案1】:

我认为您的代码对于基本活动来说有些复杂 我会指出一些错误,但最好在使用 android studio 之前学习一些基础知识。

  1. 您的 java 类名以小写字母 mainActivity 开头,最好不要使用,请始终在您的类名开头使用大写字母,例如:MainActivity

    李>
  2. 要使用 setContentView(); 将您的布局文件链接到 java 类,请尝试使用布局的 id 来调用它,这是最佳实践。例如:setContentView(R.layout.activity_main);

  3. 由于您的错误表明 java.lang.RuntimeException: Unable to start activity ,存在与您的活动文件相关的问题。我认为您是在 setContentView(); 之前声明和使用按钮,我们可以在 setContentView(); 之后声明和使用我们的 java 类中的按钮和其他代码,以便正确显示活动。

例如:

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

        Button myButton = new Button(this);
        ....
        ....
          }
  1. 为了改变布局、按钮的背景颜色和其他属性,如从字符串中给出按钮名称等,最好在其相应的 XML 布局资源文件中进行更改

你用过的那个:

    myLayout.setBackgroundColor(Color.BLUE);
    myButton.setBackgroundColor(Color.YELLOW);
    myButton.setText(R.string.myButton);
    RelativeLayout.LayoutParams buttonDetails =
           new  RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT
            );

最简单也最合适的方法是:

    <Button
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/stringname"
    android:textStyle="bold"
    android:background="@color/colorAccent"
    android:textColor="@color/colorPrimary"
    />

【讨论】:

    【解决方案2】:

    卡兰,看来你的问题可能出问题了

       myLayout.addView(myButton,buttonDetails);
    

    在此之前您已经将按钮添加到布局中。

       myLayout.addView(myButton);
    

    了解如何以编程方式创建布局是件好事,但我强烈建议您改用 XML 执行此操作,并且仅当您需要在运行时进行更改时才使用代码执行操作。此外,当您使用 XML 时,您会获得设计编辑器,您可以在其中直观地看到它的外观。

    【讨论】:

      【解决方案3】:

      刚刚从我的代码中删除了一行

      myLayout.addView(myButton);

      而且效果很好

      实际上存在问题,因为要求相同的按钮对象在屏幕上显示两次。

      【讨论】:

        猜你喜欢
        • 2016-09-04
        • 2020-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-08
        相关资源
        最近更新 更多