不能从片段开始活动,得到IllegalArgumentException。

问题描述 投票:0回答:1

我试图从我的片段中启动一个活动,但得到这个错误。

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

}

代码在片段上出现错误,但在活动上却能正常工作。

任何机构可以帮助?

java android android-activity fragment
1个回答
0
投票

你可以尝试用这段代码代替你的片段中的 "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();

0
投票

试试不加第二个 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


0
投票

如果你想从片段中打开活动,你需要使用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();

    }

}

0
投票

我终于找到了我那该死的解决方案,问题是我使用键盘可见性事件库来控制键盘的隐藏和可见性。

我使用这段代码来控制,但我必须在方法中传递活动来处理生命周期。

KeyboardVisibilityEvent.setEventListener(getActivity(), this::updateKeyboardStatusText); 

但我必须通过方法中的activity来处理生命周期。

KeyboardVisibilityEvent.setEventListener(getActivity(), getActivity(), this::updateKeyboardStatusText);

希望对大家有所帮助,谢谢大家

© www.soinside.com 2019 - 2024. All rights reserved.