使用单选按钮和复选框执行类似任务(Android)

时间:2013-09-13 06:39:58

标签: java android

我有一个EditText视图和一个checkBox(隐藏),以及两个radioButtons(隐藏和显示)。按钮和复选框的功能是隐藏或显示EditView的hin。我想第一个问题是为什么我想首先要这样做。好吧,我对android很新,我只是尝试不同的东西。

当我运行代码时,Activity无法启动。我在放置任何单选按钮之前测试了程序,只有程序中的复选框才能正常工作。所以我假设问题在于单选按钮,或两者的组合用于同一任务。

这是我的代码:

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;

public class EmPubLiteActivity extends Activity implements
CompoundButton.OnCheckedChangeListener {

CheckBox cb;
EditText et;
RadioButton rbHide;
RadioButton rbShow;
RadioGroup rg;

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

    cb = (CheckBox)findViewById(R.id.cbHideHint);
    cb.setOnCheckedChangeListener(this);
    et = (EditText)findViewById(R.id.editText1);

    rbHide = (RadioButton)findViewById(R.id.rbHide);
    rbShow = (RadioButton)findViewById(R.id.rbShow);

    RadioGroup rg = new RadioGroup(this);
    rg.addView(rbHide);
    rg.addView(rbShow);
    rbHide.setOnCheckedChangeListener(this);
    rbShow.setOnCheckedChangeListener(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.em_pub_lite, menu);
    return true;
}

@Override
public void onCheckedChanged(CompoundButton view, boolean isChecked) {

    switch (view.getId()) {

    case R.id.cbHideHint:
        if (isChecked) {
            et.setHint(R.string.nothing);
            rbHide.setChecked(true);
        }
        else {
            et.setHint(R.string.text_here);
            rbShow.setChecked(true);
        }
        break;
    case R.id.rbHide:
            et.setHint(R.string.nothing);
            cb.setChecked(false);
        break;
    case R.id.rbShow:
            et.setHint(R.string.text_here);
            cb.setChecked(true);
    }
  }
}

我收到了以下错误,以及其他一些错误,但我感觉这就是问题所在:

java.lang.IllegalStateException: the specified child already has a parent. 
You must call removeView() on the child's parent first.

此错误意味着什么,我该如何解决?

1 个答案:

答案 0 :(得分:1)

rbHide = (RadioButton)findViewById(R.id.rbHide);
rbShow = (RadioButton)findViewById(R.id.rbShow);

RadioGroup rg = new RadioGroup(this);
rg.addView(rbHide);
rg.addView(rbShow);
rbHide.setOnCheckedChangeListener(this);
rbShow.setOnCheckedChangeListener(this);

在布局xml中,rbHiderbShow已经是其父视图的子级。现在,您可以将它们添加到新创建的视图中,而无需将其从父项中删除。您应该在布局xml中定义RadioGroup,而不是在代码中创建它们。它应该是这样的:

<RadioGroup
    android:id="@+id/radioGroup"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checkedButton="@+id/rbHide" >

        <RadioButton
            android:id="@+id/rbHide"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/rbShow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

</RadioGroup>