Java 从一个片段到另一个片段返回变量

Java 从一个片段到另一个片段返回变量,java,android,android-fragments,Java,Android,Android Fragments,我想通过单击界面上的按钮,将变量从当前片段返回到上一个片段。我不能将变量从一个从Fragment类扩展的片段返回到另一个从Fragment类扩展的片段 但我可以通过接口使用相同的传输方法在DialogFragment之间返回变量 在MainActivity中,我加载FirstFragment: getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new Fi

我想通过单击界面上的按钮,将变量从当前片段返回到上一个片段。我不能将变量从一个从Fragment类扩展的片段返回到另一个从Fragment类扩展的片段

但我可以通过接口使用相同的传输方法在DialogFragment之间返回变量

在MainActivity中,我加载FirstFragment:

getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
                new FirstFragment()).commit();
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);
    }

}
在类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);
    }

}
这是第二个片段类,我尝试在其中返回变量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();
    }
}
结果是:

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))
第22行是:

listener.sentAge(editText.getText().toString());

使用ViewModel。ViewModel是一个用于存储和管理UI相关数据的类。它是Android Jetpack的一部分。因此,通过使用ViewModel,即使应用程序的UI发生了更改,应用程序也将获得一些一致的数据。
示例:

在创建
第二个片段的实例时
将目标片段设置为它:

Fragment fragment = new SecondFragment();
fragment.setTargetFragment(FirstFragment.this, 0);
...
fragmentTransaction.commit();
在您的
onAttach()
方法中,
getTargetFragment()
将返回null,因为您没有使用
setTargetFragment()
设置目标片段。