在模拟器上执行应用程序时出现 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);
}
}
................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

我认为您的代码对于基本活动有些复杂性 我会指出一些错误,但最好在使用 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"
/>

Karan,看起来你的问题可能就上线了

myLayout.addView(myButton,buttonDetails);

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

myLayout.addView(myButton);

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

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

myLayout.addView(myButton(;

而且效果很好

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

最新更新