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