【问题标题】:Programmatically add button on android以编程方式在android上添加按钮
【发布时间】:2016-08-08 16:23:45
【问题描述】:

当我尝试将 ScrollView 添加到 LinearLayout 应用程序时突然终止时遇到问题。

public class DynamicButtonAdd extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button b1=new Button(getBaseContext());
        b1.setText("Button 1");

        Button b2=new Button(getBaseContext());
        b2.setText("Button 2");

        Button b3=new Button(getBaseContext());
        b3.setText("Button 3");

        Button b4=new Button(getBaseContext());
        b4.setText("Button 4");

        Button b5=new Button(getBaseContext());
        b5.setText("Button 5");

        Button b6=new Button(getBaseContext());
        b6.setText("Button 6");

        Button b7=new Button(getBaseContext());
        b7.setText("Button 7");

        Button b8=new Button(getBaseContext());
        b8.setText("Button 8");

        Button b9=new Button(getBaseContext());
        b9.setText("Button 9");

        Button b10=new Button(getBaseContext());
        b10.setText("Button 10");

        Button b11=new Button(getBaseContext());
        b11.setText("Button 1");

        Button b12=new Button(getBaseContext());
        b12.setText("Button 12");

        TableLayout.LayoutParams l=new TableLayout.LayoutParams();
        l.width= l.height=Toolbar.LayoutParams.WRAP_CONTENT;

        b1.setLayoutParams(l);

        b2.setLayoutParams(l);
        b3.setLayoutParams(l);
        b4.setLayoutParams(l);
        b5.setLayoutParams(l);
        b6.setLayoutParams(l);
        b7.setLayoutParams(l);
        b8.setLayoutParams(l);
        b9.setLayoutParams(l);
        b10.setLayoutParams(l);
        b11.setLayoutParams(l);
        b12.setLayoutParams(l);

        ScrollView sv=new ScrollView(getBaseContext());
        sv.setFillViewport(true);


        LinearLayout linear=new LinearLayout(getBaseContext());

        sv.addView(linear);// the error appear here if I comment this line works fine without scroll
        linear.setOrientation(LinearLayout.VERTICAL);
        linear.setGravity(Gravity.CENTER);

        linear.addView(b1);
        linear.addView(b2);
        linear.addView(b3);
        linear.addView(b4);
        linear.addView(b5);
        linear.addView(b6);
        linear.addView(b7);
        linear.addView(b8);
        linear.addView(b9);
        linear.addView(b10);
        linear.addView(b11);
        linear.addView(b12);

        setContentView(linear);
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getBaseContext(),"Clicked",Toast.LENGTH_SHORT).show();
            }
        });
    }
}

显示的异常:

08-08 16:42:39.140 26674-26674/com.example.sid.test D/AndroidRuntime: Shutting down VM
08-08 16:42:39.140 26674-26674/com.example.sid.test W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xb60ab4f0)
08-08 16:42:39.144 26674-26674/com.example.sid.test E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sid.test/com.example.sid.test.DynamicButtonAdd}: 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:1647)
                                                                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
                                                                          at android.app.ActivityThread.access$1500(ActivityThread.java:117)
                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                          at android.os.Looper.loop(Looper.java:130)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:3683)
                                                                          at java.lang.reflect.Method.invokeNative(Native Method)
                                                                          at java.lang.reflect.Method.invoke(Method.java:507)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
                                                                          at dalvik.system.NativeStart.main(Native Method)
                                                                       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:1976)
                                                                          at android.view.ViewGroup.addView(ViewGroup.java:1871)
                                                                          at android.view.ViewGroup.addView(ViewGroup.java:1828)
                                                                          at android.view.ViewGroup.addView(ViewGroup.java:1808)
                                                                          at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:271)
                                                                          at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:145)
                                                                          at com.example.sid.test.DynamicButtonAdd.onCreate(DynamicButtonAdd.java:106)
                                                                          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
                                                                          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
                                                                          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
                                                                          at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
                                                                          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
                                                                          at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                          at android.os.Looper.loop(Looper.java:130) 
                                                                          at android.app.ActivityThread.main(ActivityThread.java:3683) 
                                                                          at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                          at java.lang.reflect.Method.invoke(Method.java:507) 
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
                                                                          at dalvik.system.NativeStart.main(Native Method) 

我不关心程序,如果您知道任何有用的方案,请告诉我。还有一件事,最低 api 级别是 8 (Android 2.2)。

【问题讨论】:

  • 希望你已经初始化了所有的按钮
  • 您可能应该发布异常。如果没有例外,我们无法知道您的应用崩溃的原因。
  • 我编辑了问题,请看一下
  • 为什么不在 ScrollView 中使用 ListView 而不是 LinearLayout?

标签: android button scrollview android-linearlayout android-2.2-froyo


【解决方案1】:

您的代码存在一些问题。导致崩溃的原因是您将LinearLayout 添加到ScrollView,然后调用setContentView(linear),即您将LinearLayout 添加到您的活动和ScrollView。您可能希望根据自己的内容设置ScrollView。因此,简单的解决方法是:

ScrollView sv=new ScrollView(getBaseContext());
sv.setFillViewport(true);

LinearLayout linear=new LinearLayout(getBaseContext());
sv.addView(linear);
...
setContentView(sv); // you have linear here

其次,问题是:

TableLayout.LayoutParams l=new TableLayout.LayoutParams();
l.width= l.height=Toolbar.LayoutParams.WRAP_CONTENT;

您正在将此LayoutParam 设置为您的Button 实例,这些实例将被添加到LinearLayout。您应该在此处设置父 ViewGroup 的布局参数:

LinearLayout.LayoutParams l=new LinearLayout.LayoutParams();
l.width = l.height = LinearLayout.LayoutParams.WRAP_CONTENT;

第三,我有一种轻微的感觉(我可能是错的,因为我不知道真正的用例),你可以将这个布局描述的至少一部分移动到 xml 文件中

【讨论】:

  • 谢谢,它工作正常。你能给我一些关于动态做这类事情的有用链接吗?
  • 我通常只喜欢 SO :D...如果你在 Chrome 上,你还可以安装一个名为“Codota”的插件,它可以很好地在浏览器中使用 Android 代码,还可以在谷歌搜索中显示示例等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多