Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 试图理解相关布局_Android_Adt - Fatal编程技术网

Android 试图理解相关布局

Android 试图理解相关布局,android,adt,Android,Adt,Android dev是一个全新的开发者,我正试图用一小段代码找出哪些地方出了问题 我有一个相对的布局(我认为最适合我的需要)。我在activity_main.xml文件中指定的一行上有两个按钮。当我按下其中一个按钮时,我想让EditText字段和按钮重复出现在同一行上,位于最后一组项目的下方。有点像这样: 按钮 |__|钮扣 我的函数会在第一次点击时添加EditText,但最后会出现一行3个按钮,如下所示: 按钮 |__| 下面是代码,我是否缺少有关相对布局的内容?我是否以一种糟糕透顶的方式访

Android dev是一个全新的开发者,我正试图用一小段代码找出哪些地方出了问题

我有一个相对的布局(我认为最适合我的需要)。我在activity_main.xml文件中指定的一行上有两个按钮。当我按下其中一个按钮时,我想让EditText字段和按钮重复出现在同一行上,位于最后一组项目的下方。有点像这样:

按钮

|__|钮扣

我的函数会在第一次点击时添加EditText,但最后会出现一行3个按钮,如下所示:

按钮

|__|

下面是代码,我是否缺少有关相对布局的内容?我是否以一种糟糕透顶的方式访问元素

//Get main layout as defined in activity_main.xml
        final RelativeLayout rl = (RelativeLayout)this.findViewById(R.id.rootLayout);


        //Setup rules
        final RelativeLayout.LayoutParams below = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        final RelativeLayout.LayoutParams right = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);      

        newTimer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                below.addRule(RelativeLayout.BELOW,rl.getChildAt(rl.getChildCount()-1).getId() );

                EditText timerName = new EditText(MainActivity.this);
                Button btnAddNewTimer = new Button(MainActivity.this);

                timerName.setText("New Timer");
                timerName.setVisibility(View.VISIBLE);
                timerName.setLayoutParams(below);

                rl.addView(timerName);

                right.addRule(RelativeLayout.RIGHT_OF,rl.getChildAt(rl.getChildCount()-1).getId());

                btnAddNewTimer.setText("Add");
                btnAddNewTimer.setVisibility(View.VISIBLE);
                btnAddNewTimer.setLayoutParams(right);

                rl.addView(btnAddNewTimer);

            }
        });

考虑到某些原因,
right.addRule
没有计算添加到视图中的新子项
timerName

正如我们所知,
btnAddNewTimer
需要放置在
timerName
edittext的右侧,请尝试将
timerName id
传递到
右侧。addRule

因此,与其

right.addRule(RelativeLayout.RIGHT_OF,rl.getChildAt(rl.getChildCount()-1).getId());
试试看

right.addRule(RelativeLayout.RIGHT_OF, timerName.getId());

希望这能有所帮助。

我个人不相信getChildCount()-1.getId()可以获取最后添加的视图

此外,还需要在新项目垂直放置的位置指定布局参数。因此,您需要在右侧添加一条规则,使其顶部与按钮对齐

我建议您获取添加视图的id

            timerName.setText("New Timer");
            timerName.setVisibility(View.VISIBLE);
            timerName.setLayoutParams(below);
            timerName.setId(39);//or some other unique id in this range
            rl.addView(timerName);


            right.addRule(RelativeLayout.RIGHT_OF, timerName.getId());
            right.addRUle(RelativeLayout.ALIGN_TOP,timerName.getId());

            btnAddNewTimer.setText("Add");
            btnAddNewTimer.setVisibility(View.VISIBLE);
            btnAddNewTimer.setLayoutParams(right);

后续子问题,为什么范围为39?我检查了最后一个孩子的id,其范围为2131230722。id保证一直都那么大吗?它们很大。我相信所有通过XMLA分配的id都被限制为0x00FFFFFF以上的值,但目前我找不到确切的文档。