Невозможно использовать onClickListener внутри фрагмента

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

Родительская деятельность:

package app2.tarun.com.fragments2;


import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class AdminPanel extends AppCompatActivity implements 
FragmentChangePassword.OnButtonClickedListener{

private String password, c_password;
EditText et_password, et_c_password;
DataBaseHelper db;
Button btn_change_password;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate (savedInstanceState);
    setContentView (R.layout.admin_panel);
    btn_change_password = findViewById (R.id.btn_changePassword);
    et_password =  findViewById (R.id.admin_input_password);
    et_c_password =  findViewById (R.id.admin_input_reEnterPassword);
    db=  new DataBaseHelper (this);

}


public void changeFragment(View view) {
    Fragment fragment;

    if (view == findViewById (R.id.register)) {
        fragment = new FragmentRegisterUser ();
        FragmentManager fm = getSupportFragmentManager ();
        FragmentTransaction ft = fm.beginTransaction ();
        ft.replace (R.id.fragment, fragment);
        ft.commit ();
    }

    if (view == findViewById (R.id.change_password)) {

        Log.e("mmmmmmmmmm","ssssssssss");
        Toast.makeText (this, "Hello", Toast.LENGTH_LONG).show ();

        fragment = new FragmentChangePassword ();
        FragmentManager fm = getSupportFragmentManager ();
        FragmentTransaction ft = fm.beginTransaction ();
        ft.replace (R.id.fragment, fragment);
        ft.commit ();
    }


}



@Override
public void onButtonClicked() {
    Log.e("mmmmmmmmmm","ssssssssss");
    Toast.makeText (this, "vdsfds", Toast.LENGTH_LONG).show ();
    password = et_password.getText ().toString ();
    c_password = et_c_password.getText ().toString ();
    if (password.equals (c_password)) {
        db.changePassword (password);
        finish ();
    } else
        Toast.makeText (this, "vdsfds", Toast.LENGTH_LONG).show ();
}

}

Фрагмент активности:

package app2.tarun.com.fragments2;


import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class FragmentChangePassword extends Fragment implements View.OnClickListener {



OnButtonClickedListener mCallback;
Button btn_change_password;




@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    return inflater.inflate(R.layout.fragment_fragment_change_password, container, false);

}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated (view, savedInstanceState);

    mCallback = (OnButtonClickedListener) getActivity ();
    btn_change_password = getActivity ().findViewById (R.id.btn_changePassword);


}

@Override
public void onClick(View view) {
    Log.e("mmmmmmmmmm","ssssssssss");
    if (view.getId ()==R.id.btn_changePassword) {
        mCallback.onButtonClicked ();
    }
}


public interface OnButtonClickedListener {
    void onButtonClicked();
}

}

Если кнопка находится во фрагменте, используйте view.findViewById() вместо getActivity().findViewById.

ADM 23.06.2018 20:15

Сделанный. все еще сталкивается с той же проблемой, @ADM

Tarun Thapa 23.06.2018 20:23

Нет ответа на нажатие кнопки

Tarun Thapa 23.06.2018 20:24

где назначаются обратные вызовы по клику? Не могли бы вы предоставить xml-код? Где называется фрагмент изменения? Кажется, что фрагмент не показан

Alexander Bratusenko 23.06.2018 20:48
1
4
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

I am not quite sure how to attach the listener to the button so when implementing the View.OnclickListener interface so maybe I missed something there

Когда вы реализуете View.OnclickListener во фрагменте, вам также необходимо установить слушателя на представление.

Вам нужно сделать что-то вроде этого:

btn_change_password.setOnClickListener(this);

this ссылается на Фрагмент, который уже реализует View.OnclickListener

В случае вашего Activity, я подозреваю, что вы используете android:onClick в XML для Activity. Итак, когда у вас есть что-то подобное в вашем XML:

<Button
    ...
    android:onClick = "changeFragment">

</Button>

Ваш клик будет работать, потому что у вас есть следующий метод в вашей деятельности:

public void changeFragment(View view) {
  ...
}

Другие вопросы по теме