2013-09-13 2 views
0

У меня есть вид EditText и checkBox (скрыть) и два radioButtons (скрыть и показать). Функция кнопок и флажка - это скрыть или показать хинтто EditView. Я предполагаю, что первый вопрос заключается в том, почему я хотел бы сделать это в первую очередь. Ну, я совершенно новичок в андроиде, и я просто пробую разные вещи.Использование переключателей и флажков для аналогичной задачи (Android)

Когда я запускаю код, действие не запускается. Я тестировал программу, прежде чем я даже разместил какие-либо переключатели, и она отлично работала только с флажком в программе. Поэтому я предполагаю, что проблема лежит где-то с радиокнопками или комбинацией обоих, используемых для одной и той же задачи.

вот мой код:

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

, но если вы уже объявили радиокнопку в xml-файле, то почему вы снова добавляете ее динамически ??? – Piyush

+0

@Piyush Gupta: да, в значительной степени решена проблема –

ответ

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, rbHide и rbShow уже ребенок его родительского вида. Теперь вы добавляете их во вновь созданный вид, не удаляя их из своего родителя. Вы должны определить RadioGroup внутри макета xml вместо того, чтобы создавать их в коде. Он должен выглядеть так:

<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> 
Смежные вопросы