Android 我想通过编程方式在RelativeLayout中添加一对EditText,只需单击一个按钮

Android 我想通过编程方式在RelativeLayout中添加一对EditText,只需单击一个按钮,android,android-edittext,textview,android-relativelayout,Android,Android Edittext,Textview,Android Relativelayout,第一组编辑文本整齐地一个接一个地添加,但再次单击按钮时,视图会重叠。我想我需要适当地设置利润率,但我无法计算出来。请帮忙 public class MainActivity extends Activity implements OnClickListener { Button btn_task, btn_subTask; EditText et_task, et_subTask; RelativeLayout lv_subtask, lv_task; int i

第一组编辑文本整齐地一个接一个地添加,但再次单击按钮时,视图会重叠。我想我需要适当地设置利润率,但我无法计算出来。请帮忙

public class MainActivity extends Activity implements OnClickListener {
    Button btn_task, btn_subTask;
    EditText et_task, et_subTask;
    RelativeLayout lv_subtask, lv_task;
    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_task = (Button) findViewById(R.id.btn_addTask);
        btn_subTask = (Button) findViewById(R.id.btn_subTask);
        lv_subtask = (RelativeLayout) findViewById(R.id.lv_subtask);
        lv_task = (RelativeLayout) findViewById(R.id.lv_task);

        // btn_task.setOnClickListener(this);
        btn_subTask.setOnClickListener(this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View v) {

        if (v.equals(btn_subTask)) {
            EditText et_title = new EditText(this);
            EditText et_date = new EditText(this);
            i++;
            et_title.setId(i);
            et_date.setId(i + 1);
            et_title.setHint("Enter sub task");
            et_date.setHint("Enter end date");
            // lv_subtask.setVisibility(View.VISIBLE);
            RelativeLayout.LayoutParams EditLayoutParams = new RelativeLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            RelativeLayout.LayoutParams DateLayoutParams = new RelativeLayout.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
            DateLayoutParams.setMargins(5, 10, 0, 0);
            EditLayoutParams.setMargins(5, 20, 0, 0);
            if (i != 1) {
                EditLayoutParams.addRule(RelativeLayout.BELOW, i + 1);
                DateLayoutParams.addRule(RelativeLayout.BELOW, i + 2);

            } else {
                DateLayoutParams.addRule(RelativeLayout.BELOW, 1);
            }
            et_title.setLayoutParams(EditLayoutParams);
            et_date.setLayoutParams(DateLayoutParams);
            (lv_subtask).addView(et_title);
            (lv_subtask).addView(et_date);

        }

    }
}

看起来你没有正确使用计数器。首先,每次调用onClick时,只需将其递增1,但要添加2个视图。此外,当您尝试将新视图放在以前视图的下方时,您正在向计数器中添加新视图,它将引用您尚未设置的ID。试试这个:

if (v.equals(btn_subTask)) {
    EditText et_title = new EditText(this);
    EditText et_date = new EditText(this);
    et_title.setId(++i); // 1, 3, ...
    et_date.setId(++i); // 2, 4, ...
    et_title.setHint("Enter sub task");
    et_date.setHint("Enter end date");
    // lv_subtask.setVisibility(View.VISIBLE);
    RelativeLayout.LayoutParams EditLayoutParams = new RelativeLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    RelativeLayout.LayoutParams DateLayoutParams = new RelativeLayout.LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    DateLayoutParams.setMargins(5, 10, 0, 0);
    EditLayoutParams.setMargins(5, 20, 0, 0);
    if (i != 2) {
        EditLayoutParams.addRule(RelativeLayout.BELOW, i - 2); // below last view added
    }
    DateLayoutParams.addRule(RelativeLayout.BELOW, i - 1); // always below current edit
    et_title.setLayoutParams(EditLayoutParams);
    et_date.setLayoutParams(DateLayoutParams);
    (lv_subtask).addView(et_title);
    (lv_subtask).addView(et_date);

}

如果两个EditText神奇地出现,请将EditText隐藏在布局中,然后在单击按钮时使其可见。诀窍在于,当你设计它们时,它们总是可见的,而当应用程序启动时,你会隐藏它们

为可见性定义一个布尔值,然后在onResume中使用该布尔值设置可见性

  boolean ismyedittextvisible = false;


 public void onResume();
     super.onResume();
     view.findViewById(R.id.myedittext)
                .setVisibility(ismyedittextvisible ? View.VISIBLE : View.GONE);
在按钮中,单击以调整布尔值并刷新可见性

@Override
public void onClick(final View v) {
    if (v.getId() == R.id.mybutton) {
        ismyedittextvisisble = !ismyedittextvisible;
        view.findViewById(R.id.myedittext)
                .setVisibility(ismyedittextvisible ? View.VISIBLE : View.GONE);
    }
}

为什么不在else语句中向EditLayoutParams添加任何规则?谢谢您的建议。但我想如果我只需要查看一次,这会很有帮助。但在这里,我将添加编辑文本对,每次点击按钮。感谢您指出错误。你的解决方案奏效了。谢谢