Не удается начать действие с фрагмента, получая исключение IllegalArgumentException - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь запустить действие из своего фрагмента, но получаю эту ошибку:

Причина: java .lang.IllegalArgumentException: параметр, указанный как ненулевой, является нулевым: метод 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);
   }

}

код получает ошибку на фрагменте, но работает на активность.

любое тело может помочь ??

Ответы [ 4 ]

0 голосов
/ 28 апреля 2020

Наконец-то я нашел решение, черт побери. проблема в том, что я использую библиотеку KeyboardVisibilityEvent для управления клавиатурой скрытия и видимости.

Я использую этот код для управления:

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

, но я должен передать действие в метод для обработки жизненного цикла

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

надеюсь помочь кому-нибудь. спасибо всем

0 голосов
/ 28 апреля 2020

Попробуйте без второго getActivity(). Метод startActivity() существует и в классе Fragment.

Intent intent = new Intent(getActivity(), NewActivity.class);
startActivity(intent);

Edit: Вы вызываете onClickListener в тот момент, когда действие может быть не готово. Подробнее о жизненном цикле фрагмента. Попробуйте:

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    onClickListener();
}

Или в @Override public void onViewCreated

0 голосов
/ 28 апреля 2020

Если вы хотите открыть активность из фрагмента, вам нужно использовать 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

Одна вещь, которую я замечаю из вашего сообщения об ошибке:

Указанный параметр ненулевое значение равно null: метод kotlin .jvm.internal.Intrinsics.checkParameterIsNotNull, комплект параметров

, поэтому я бы добавил @Nullable в Bundle saveInstanceState

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

one больше всего вам нужно переключить ваш код следующим образом

@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 голосов
/ 28 апреля 2020

Вы можете попробовать этот код вместо "getActivity" в вашем фрагменте:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...