Интерфейс фрагмента во фрагменте не работает - PullRequest
0 голосов
/ 31 августа 2018

У меня проблемы с разработкой Android. Среда настроена на работу в минимальном API 23.

Вот чего я пытаюсь добиться: У меня есть MainActivity с BottomNavigationView. При нажатии на элемент в BottomNavigationView запускается фрагмент. Это работает очень хорошо, я могу отправлять данные во фрагмент и иметь интерфейс для диалога с моей деятельностью.

Проблема в следующем: В моем последнем фрагменте (ProgramFragment) я хотел бы создать мастер форм. Итак, я хотел бы запустить другие фрагменты из ProgramFragment. Я использовал тот же метод, что и в MainActivity, и я могу запустить первый фрагмент (RecStartFragment), где есть кнопка в макете. Я хочу, чтобы при нажатии кнопки отображался следующий фрагмент (RecDataPatientFragment). Когда я нажимаю на кнопку, появляется сообщение об ошибке:

java.lang.NullPointerException: Attempt to invoke interface method 
'void x.RecStartFragment$OnRecStartFragmentListener.startRecProg()' 
on a null object reference at 
x.RecStartFragment$1.onClick(RecStartFragment.java:30)

Есть ли способ достичь этого? Почему это работает из деятельности, а не из фрагмента?

Вот код фрагмента RecStartFragment

package x;

import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class RecStartFragment extends Fragment {
    private static final String TAG = RecStartFragment.class.getName();
    private View v;
    OnRecStartFragmentListener onRecStartFragmentListener;

    private Button btnStartRec;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        if(v != null) {
            return v;
        }
        v = inflater.inflate(R.layout.fragment_rec_start, null);
        btnStartRec = v.findViewById(R.id.btn_start_rec);
        btnStartRec.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onRecStartFragmentListener.startRecProg();
            }
        });
        return v;
    }

    public interface OnRecStartFragmentListener
    {
        public void startRecProg();
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            onRecStartFragmentListener = (OnRecStartFragmentListener) context;
        } catch (Exception e)
        {

        }
    }

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Вы должны реализовать интерфейс в своей деятельности:

Осуществление деятельности:

public class MainActivity extends AppCompatActivity implements RecStartFragment.OnRecStartFragmentListener{

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

    @Override
    public void startRecProg() {
        //Do whatever you need do here.
        Log.e("Calback:","Interface is working");
    }


}
0 голосов
/ 31 августа 2018

У вас есть исключение нулевого указателя (NPE), указывающее, что поле OnRecStartFragmentListener onRecStartFragmentListener не было инициализировано.

Из вашего кода вы пытаетесь инициализировать поле в onAttach() и перехватываете исключения, но ничего с ними не делаете:

@Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            onRecStartFragmentListener = (OnRecStartFragmentListener) context;
        } catch (Exception e)
        {

        }
    }

Попробуйте распечатать трассировку стека для любых исключений:

e.printStackTrace()

Контекст, переданный в onAttach, является вашим MainActivity? Если да, то реализует ли он OnRecStartFragmentListener?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...