我在我的活动中有这个界面。
public interface LogoutUser {
void logout();
}
我的片段实现了这个接口,因此在我的片段中,我有这个:
@Override
public void logout() {
// logout
}
在我的活动中,我调用了
mLogoutUser.logout();
mLogoutUser
是一个类型为LogoutUser接口的对象。
我的问题在于mLogoutUser
对象为空。如何初始化它?
谢谢!
我在我的活动中有这个界面。
public interface LogoutUser {
void logout();
}
我的片段实现了这个接口,因此在我的片段中,我有这个:
@Override
public void logout() {
// logout
}
在我的活动中,我调用了
mLogoutUser.logout();
mLogoutUser
是一个类型为LogoutUser接口的对象。
我的问题在于mLogoutUser
对象为空。如何初始化它?
谢谢!
正如我在评论中所说,我使用了我的碎片中的onAttach
方法解决了这个问题。但是这种方式需要在碎片中声明回调字段(在这种情况下为mLogoutUser),并以以下方式初始化:
public class MyFragment extends ListFragment {
LogoutUser mLogoutUser;
// Container Activity must implement this interface
public interface LogoutUser {
public void logout();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mLogoutUser = (LogoutUser) context;
} catch (ClassCastException e) {
throw new ClassCastException(context.toString()
+ " must implement LogoutUser");
}
}
...
}
在与其他片段通信中了解更多信息。
但如果您的情况是在活动中声明的字段,您可以使用onAttachFragment
方法从您的活动初始化监听器字段,如下所示:
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
mLogoutUser = (LogoutUser) fragment;
}
另外,您可以使用事件总线来实现片段和活动之间的通信。一个选择是来自Square的Otto库。
示例:如何在 Fragment 和 Activity 之间创建回调
public interface CallBackListener {
void onCallBack();// pass any parameter in your onCallBack which you want to return
}
CallBackFragment.class
:回调片段类public class CallBackFragment extends Fragment {
private CallBackListener callBackListener;
public CallBackFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_call_back, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//getActivity() is fully created in onActivityCreated and instanceOf differentiate it between different Activities
if (getActivity() instanceof CallBackListener)
callBackListener = (CallBackListener) getActivity();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Button btn = (Button) view.findViewById(R.id.btn_click);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(callBackListener != null)
callBackListener.onCallBack();
}
});
}
}
CallbackHandlingActivity.class
public class CallbackHandlingActivity extends AppCompatActivity implements CallBackListener
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_all_user);
}
@Override
public void onCallBack() {
Toast.makeText(mContext,"onCallback Called",Toast.LENGTH_LONG).show();
}
}
Fragment.onDestroy()
/ Fragment.onStop()
中将 callBackListener
置为空? - Ehtesham Hasan您需要使用getFragmentById()
或getFragmentByTag()
获取对碎片的引用。
getFragmentManager().findFragmentById(R.id.example_fragment);
Channel
在片段和活动之间发送数据或回调,反之亦然。val loginPromptChannel = Channel<LoginPromptState>()
val loginStateFlow = loginPromptChannel.receiveAsFlow()
//onCreate
lifecycleScope.launchWhenStarted {
loginStateFlow.collect() { state ->
when (state) {
is LoginPromptState.Login -> {
//smooth scroll to login fragment
binding.viewpager.setCurrentItem(2, true)
}
}
}
}
//create sealed a class
sealed class LoginPromptState {
object Login : LoginPromptState()
}
lifecycleScope.launch {
val channelLogin = (activity as MainActivity).loginPromptChannel
channelLogin.send(MainActivity.LoginPromptState.Login)
}