Return variable From Fragment to Fragment

Ilja Tarasovs :

I want to return variable from current Fragment to previous Fragment by clicking on button with interface. I cant return variable from one Fragment extended from Fragment class to another Fragment extended from Fragment class.

But I can return variable from DialogFragment to Fragment with the same transferring method through interface.

In MainActivity I load FirstFragment:

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                new FirstFragment()).commit();

In class FirstFragment onClick TextView tvSecondFragment I create Fragment:

class FirstFragment extends Fragment implements SecondFragment.SecondFragmentListener {
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.first_fragment, container, false);

        tvSecondFragment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Fragment fragment = new SecondFragment();
                FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                fragmentTransaction.add(R.id.fragment_container, fragment);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();

            }
        });

return view;
}

    @Override
    public void sentAge(String input) {
        Log.d(TAG, "method sentAge called with variable: " + input);
    }

}

This is SecondFragment class where I try to return variable onClick button:

public class SecondFragment extends Fragment {
    private SecondFragmentListener listener;
    public interface SecondFragmentListener {
        public void sentAge(String input);
    }

    private EditText editText;
    private Button button;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.second_fragment, container, false);

        editText = view.findViewById(R.id.et_age);
        button = view.findViewById(R.id.btn_transfer_age);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(), "Button Pressed", Toast.LENGTH_SHORT).show();
                listener.sentAge(editText.getText().toString());
                getFragmentManager().popBackStack();
            }
        });


        return view;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        listener = (SecondFragmentListener) getTargetFragment();
    }
}

This is the result:

Attempt to invoke interface method 
'void com.example.transfervariablesthroughfragment.SecondFragment$SecondFragmentListener.sentAge(java.lang.String)' 
on a null object reference
at com.example.transfervariablesthroughfragment.SecondFragment$1.onClick(SecondFragment.java:22))

line 22 is:

listener.sentAge(editText.getText().toString());
Akaki Kapanadze :

When creating an instance of your SecondFragment set target fragment to it:

Fragment fragment = new SecondFragment();
fragment.setTargetFragment(FirstFragment.this, 0);
...
fragmentTransaction.commit();

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=329309&siteId=1