android - setonclicklistener - metodo onclick en un fragment
Forma correcta de invocar OnClickListener en fragmentos (1)
Estoy desarrollando una aplicación que contiene un fragmento de marcador personalizado. La funcionalidad de este fragmento debe ser la misma que la del marcador de stock. Cuando presiono un botón, ese número aparece en la ventana editText, tan simple como eso.
Pero, no aparece ningún número en editText. Primero probé esto usando Activities en lugar de fragmentos y funcionó. Ahora me he visto obligado a cambiar las actividades a fragmentos, y he estado adaptando el código a los fragmentos evidentemente, pero esta funcionalidad no funciona.
Este es el fragmento de PhoneView
:
public class PhoneView extends Fragment implements OnTabChangeListener, OnClickListener {
ImageButton dialBtn;
ImageButton clearBtn;
EditText numTxt;
ImageButton button1;
ImageButton button2;
ImageButton button3;
ImageButton button4;
ImageButton button5;
ImageButton button6;
ImageButton button7;
ImageButton button8;
ImageButton button9;
ImageButton button0;
ImageButton buttonstar;
ImageButton buttonpound;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mRoot = inflater.inflate(R.layout.phone_view, null);
dialBtn = (ImageButton) mRoot.findViewById(R.id.dialButton);
clearBtn = (ImageButton) mRoot.findViewById(R.id.deleteButton);
numTxt = (EditText) mRoot.findViewById(R.id.digits);
button1 = (ImageButton) mRoot.findViewById(R.id.one);
button2 = (ImageButton) mRoot.findViewById(R.id.two);
button3 = (ImageButton) mRoot.findViewById(R.id.three);
button4 = (ImageButton) mRoot.findViewById(R.id.four);
button5 = (ImageButton) mRoot.findViewById(R.id.five);
button6 = (ImageButton) mRoot.findViewById(R.id.six);
button7 = (ImageButton) mRoot.findViewById(R.id.seven);
button8 = (ImageButton) mRoot.findViewById(R.id.eight);
button9 = (ImageButton) mRoot.findViewById(R.id.nine);
button0 = (ImageButton) mRoot.findViewById(R.id.zero);
buttonstar = (ImageButton) mRoot.findViewById(R.id.star);
buttonpound = (ImageButton) mRoot.findViewById(R.id.pound);
dialBtn.setOnClickListener(this);
clearBtn.setOnClickListener(this);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
button5.setOnClickListener(this);
button6.setOnClickListener(this);
button7.setOnClickListener(this);
button8.setOnClickListener(this);
button9.setOnClickListener(this);
button0.setOnClickListener(this);
buttonstar.setOnClickListener(this);
buttonpound.setOnClickListener(this);
return mRoot;
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.dialButton:
startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + numTxt.getText())));
break;
case R.id.deleteButton:
String contents = numTxt.getText().toString();
if (contents.length() > 0) {
numTxt.setText(contents.substring(0, contents.length()-1));
}
break;
case R.id.one:
numTxt.setText(numTxt.getText()+"1");
break;
case R.id.two:
numTxt.setText(numTxt.getText()+"2");
break;
case R.id.three:
numTxt.setText(numTxt.getText()+"3");
break;
case R.id.four:
numTxt.setText(numTxt.getText()+"4");
break;
case R.id.five:
numTxt.setText(numTxt.getText()+"5");
break;
case R.id.six:
numTxt.setText(numTxt.getText()+"6");
break;
case R.id.seven:
numTxt.setText(numTxt.getText()+"7");
break;
case R.id.eight:
numTxt.setText(numTxt.getText()+"8");
break;
case R.id.nine:
numTxt.setText(numTxt.getText()+"9");
break;
case R.id.zero:
numTxt.setText(numTxt.getText()+"0");
break;
case R.id.star:
numTxt.setText(numTxt.getText()+"*");
break;
case R.id.pound:
numTxt.setText(numTxt.getText()+"#");
break;
}
Tengo que decir que, por ejemplo, el botón de marcación funciona, lo que no funciona es mostrar los números presionados en el texto de edición. ¿Podría estar relacionado con alguna restricción o funcionalidad especial de los fragmentos?
ACTUALIZADO -> Se agregó más código arriba, y luego del xml
phone_view.xml
<!-- Layout for the dialer -->
<LinearLayout
android:id="@+id/Right_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
android:orientation="vertical"
android:layout_marginStart="@dimen/dialpad_horizontal_margin"
android:background="#000000" >
<!-- Text field above the keypad where the digits are displayed -->
<LinearLayout
android:id="@+id/digits_container"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="@integer/dialpad_layout_weight_digits"
android:layout_marginTop="@dimen/dialpad_vertical_margin"
android:gravity="center"
android:background="@drawable/dialpad_background" >
<EditText
android:id="@+id/digits"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="match_parent"
android:gravity="center"
android:scrollHorizontally="true"
android:textAppearance="@style/DialtactsDigitsTextAppearance"
android:focusableInTouchMode="false"
android:nextFocusRight="@+id/deleteButton"
android:background="@android:color/transparent"
android:inputType="none" />
<ImageButton
android:id="@+id/deleteButton"
android:layout_width="56dip"
android:layout_height="50dip"
android:layout_gravity="center_vertical"
android:gravity="center"
android:contentDescription="@string/description_delete_button"
android:src="@drawable/ic_dial_action_delete"
android:background="@drawable/dialbtn_push"/>
</LinearLayout>
<!-- The dialpad itself -->
<include layout="@layout/dialpad" />
<View
android:layout_width="match_parent"
android:layout_height="@dimen/dialpad_vertical_margin"
android:background="#66000000"/>
<FrameLayout
android:id="@+id/dialButtonContainer"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="@integer/dialpad_layout_weight_additional_buttons"
android:layout_gravity="center_horizontal"
android:background="@drawable/dialpad_background">
<ImageButton
android:id="@+id/dialButton"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@drawable/btn_call"
android:contentDescription="@string/description_dial_button"
android:src="@drawable/ic_dial_action_call" />
</FrameLayout>
</LinearLayout>
dialpad.xml
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dialpad"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="@integer/dialpad_layout_weight_dialpad"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/dialpad_vertical_margin"
android:paddingStart="5dip"
android:paddingEnd="5dip"
android:paddingBottom="10dip"
android:background="@drawable/dialpad_background"
android:layoutDirection="ltr">
<TableRow
android:layout_height="0px"
android:layout_weight="1" >
<ImageButton
android:id="@+id/one"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_1_no_vm_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_one" />
<ImageButton
android:id="@+id/two"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_2_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_two" />
<ImageButton
android:id="@+id/three"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_3_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_three" />
</TableRow>
<TableRow
android:layout_height="0px"
android:layout_weight="1">
<ImageButton
android:id="@+id/four"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_4_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_four" />
<ImageButton
android:id="@+id/five"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_5_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_five" />
<ImageButton
android:id="@+id/six"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_6_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_six" />
</TableRow>
<TableRow
android:layout_height="0px"
android:layout_weight="1">
<ImageButton
android:id="@+id/seven"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_7_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_seven" />
<ImageButton
android:id="@+id/eight"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_8_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_eight" />
<ImageButton
android:id="@+id/nine"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_9_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_nine" />
</TableRow>
<TableRow
android:layout_height="0px"
android:layout_weight="1">
<ImageButton
android:id="@+id/star"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_star_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_star" />
<ImageButton
android:id="@+id/zero"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_0_no_plus_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_zero" />
<ImageButton
android:id="@+id/pound"
style="@style/DialpadButtonStyle"
android:src="@drawable/dial_num_pound_wht"
android:background="@drawable/dialbtn_push"
android:contentDescription="@string/description_image_button_pound" />
</TableRow>
Declare numTxt
como miembro de la clase. Tienes
EditText numTxt = (EditText) mRoot.findViewById(R.id.digits);
// local to onCreateView
Cambiar a
EditText numTxt;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View mRoot = inflater.inflate(R.layout.phone_view, null);
ImageButton dialBtn = (ImageButton) mRoot.findViewById(R.id.dialButton);
ImageButton clearBtn = (ImageButton) mRoot.findViewById(R.id.deleteButton);
numTxt = (EditText) mRoot.findViewById(R.id.digits);
Editar: a la pregunta actualizada
Como dije en los comentarios, no veo nada malo con el código publicado.
Como dijiste que no puedes establecer el texto en editext, acabo de ejecutar tu código. Para fines de prueba, configuro el icono del ImageButton
como fondo para ImageButton
. Modifiqué la interfaz de usuario para fines de prueba.
Pero la lógica es la misma que usaste