我试图从我的片段中启动一个活动,但得到这个错误。
Caused by: java.lang.IllegalArgumentException: 指定为non-null的参数为空:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数捆绑。
我使用java,不知道为什么会出现kotlin错误。
这是我的片段。
public class LoginFragment extends Fragment {
private FragmentLoginBinding binding;
private AuthSharedViewModel sharedViewModel;
@Override
public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false);
sharedViewModel = ((LoginActivity) getActivity()).viewModel;
binding.setViewmodel(sharedViewModel);
binding.setLifecycleOwner(this);
onClickListener();
return binding.getRoot();
}
private void onClickListener() {
binding.loginBtn.setOnClickListener(v -> {
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent);
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
sharedViewModel.getIsFetchSmsSuccessful().removeObservers(this);
}
}
代码在片段上出现错误,但在活动上却能正常工作。
任何机构可以帮助?
你可以尝试用这段代码代替你的片段中的 "getActivity",然后在你的clickListener中输入 "IllegArgumentException: Parameter specified non-null: method kotlin.jvm.internal.Intrinsics"。
private AppCompatActivity activity;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
if (context instanceof AppCompatActivity) {
activity = (AppCompatActivity) context;
}
}
然后在你的clickListener中
Intent intent = new Intent(activity, MainActivity.class);
activity.startActivity(intent);
activity.finish();
试试不加第二个 getActivity()
. 该方法 startActivity()
也存在于Fragment类中。
Intent intent = new Intent(getActivity(), NewActivity.class);
startActivity(intent);
编辑:你在活动可能还没有准备好的时候调用onClickListener。更多关于Fragment的生命周期。试试这个。
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
onClickListener();
}
或者在 @Override public void onViewCreated
如果你想从片段中打开活动,你需要使用FragmentActivity。
所以干脆这样做
binding.loginBtn.setOnClickListener{
activity?.let{
it.startActivity(Intent (it, MainActivity::class.java))
it.finish()
}
}
或
binding.loginBtn.setOnClickListener{
requireActivity().startActivity(Intent(requireActivity(),MainActivity::class.java))
requireActivity().finish()
}
两者
activity?.let{}
和requireActivity()
是FragmentActivity
我从你的错误信息中注意到一件事
指定为非空的参数为空:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数bundle
所以我会在Bundle savedInstanceState处添加@Nullable。
@Nullable
@Override
public View onCreateView(@NotNull LayoutInflater inflater, ViewGroup container,@Nullable Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false);
sharedViewModel = ((LoginActivity) getActivity()).viewModel;
binding.setViewmodel(sharedViewModel);
binding.setLifecycleOwner(this);
onClickListener();
return binding.getRoot();
}
还有一件事,你需要像这样切换你的代码
@Override
public void onDestroyView() {
sharedViewModel.getIsFetchSmsSuccessful().removeObservers(this);
super.onDestroyView();
}
因为你想在它破坏视图之前删除Observers。
这是在kotlin中应该有的样子
class LoginFragment : Fragment() {
private var binding: FragmentLoginBinding? = null
private var sharedViewModel: AuthSharedViewModel? = null
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false)
sharedViewModel = (activity as LoginActivity).viewModel
binding.setViewmodel(sharedViewModel)
binding.setLifecycleOwner(this)
return binding.getRoot()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
onClickListener()
}
private fun onClickListener() {
binding.loginBtn.setOnClickListener{
activity?.startActivity(Intent(activity, MainActivity::class.java))
activity?.finish()
}
}
override fun onDestroyView() {
sharedViewModel.getIsFetchSmsSuccessful().removeObservers(this)
super.onDestroyView()
}
}
这就是Java
public class LoginFragment extends Fragment {
private FragmentLoginBinding binding;
private AuthSharedViewModel sharedViewModel;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false);
sharedViewModel = ((LoginActivity) getActivity()).viewModel;
binding.setViewmodel(sharedViewModel);
binding.setLifecycleOwner(this);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
onClickListener();
}
private void onClickListener() {
binding.loginBtn.setOnClickListener(v -> {
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent);
});
}
@Override
public void onDestroyView() {
sharedViewModel.getIsFetchSmsSuccessful().removeObservers(this);
super.onDestroyView();
}
}
我终于找到了我那该死的解决方案,问题是我使用键盘可见性事件库来控制键盘的隐藏和可见性。
我使用这段代码来控制,但我必须在方法中传递活动来处理生命周期。
KeyboardVisibilityEvent.setEventListener(getActivity(), this::updateKeyboardStatusText);
但我必须通过方法中的activity来处理生命周期。
KeyboardVisibilityEvent.setEventListener(getActivity(), getActivity(), this::updateKeyboardStatusText);
希望对大家有所帮助,谢谢大家