#android #kotlin #android-fragments #onclicklistener #double-click
Вопрос:
новичок здесь! Мне трудно изучать жизненный цикл фрагментов, и я застрял в этой проблеме. Если я запущу это в ЭВС, фрагмент будет отображаться в действии, но кнопку внутри фрагмента нужно нажать дважды, чтобы запустить целевое действие.
Набор фрагментов.кт:
class FragmentSetting : Fragment(), View.OnClickListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view: View = inflater!!.inflate(R.layout.fragment_main_setting, container, false) val btnLogout: Button = view.findViewById(R.id.btn_logout) val btnArticle: Button = view.findViewById(R.id.btn_art) btnLogout.setOnClickListener(this) btnArticle.setOnClickListener(this) return view } companion object { fun newInstance(): FragmentSetting { return FragmentSetting() } } override fun onClick(v: View?) { when (v?.id) { R.id.btn_logout -gt; { btn_logout.setOnClickListener { Toast.makeText(getContext(), "Signed Out.", Toast.LENGTH_SHORT).show() FirebaseAuth.getInstance().signOut() val intent = Intent(activity, SignInActivity::class.java) startActivity(intent) } } R.id.btn_art -gt; { btn_art.setOnClickListener { Toast.makeText(getContext(), "Hello World", Toast.LENGTH_SHORT).show() val intent = Intent(activity, ArticleActivity::class.java) startActivity(intent) } } } } }
Ответ №1:
Вы устанавливаете сам класс фрагмента в качестве прослушивателя для обеих кнопок при создании представления. Это было бы приемлемым местом для этого.
Однако функция прослушивания не выполняет желаемое действие кнопки. Вместо этого он устанавливает новый прослушиватель для каждой кнопки. Таким образом, при первом нажатии на них они получают своего нового слушателя. Только в этом внутреннем вторичном слушателе вы переходите к другому действию, поэтому для этого требуется два клика.
Вам нужно непосредственно выполнить свое действие, вместо того, чтобы заключать действие в настройку другого слушателя. Кстати, представление, передаваемое прослушивателю щелчков, никогда не имеет значения null, поэтому вы можете удалить ?
«s».
override fun onClick(v: View) { when (v.id) { R.id.btn_logout -gt; { Toast.makeText(getContext(), "Signed Out.", Toast.LENGTH_SHORT).show() FirebaseAuth.getInstance().signOut() val intent = Intent(activity, SignInActivity::class.java) startActivity(intent) } R.id.btn_art -gt; { Toast.makeText(getContext(), "Hello World", Toast.LENGTH_SHORT).show() val intent = Intent(activity, ArticleActivity::class.java) startActivity(intent) } } }
Комментарии:
1. это работает на меня! большое вам спасибо, сэр, теперь это действительно имело смысл.
Ответ №2:
есть две разные вещи номер один, если вы являетесь представлением реализации.Интерфейс OnClickListener так вызывающе, что вы используете метод обратного вызова onclick, они будут срабатывать каждый раз, когда вы нажимаете на него, это означает, что в методе onclick выполните фрагмент кода, напишите в методе onclick, поэтому в вашем текущем коде сначала щелкните, они установят setOnClickListener, а затем в следующий раз, когда вы нажмете, он будет работать в соответствии с ожиданиями.
так просто, что вы напрямую выполняете код с помощью фигурных скобок в завитках, не нужно устанавливать setOnClickListener. например :
R. id.btn_art -gt; { Тост.makeText(getContext(), «Привет, мир», Тост.LENGTH_SHORT).show() val намерение = Намерение(действие, ArticleActivity::class.java) Способность к началу(намерение) }
во-вторых, вы устанавливаете setOnClickOnClickListenre в своем onCreateView и не реализуете clicklistenere. например:
btn_logout.setOnClickListener { Тост.makeText(getContext(), «Вышел»., Тост.LENGTH_SHORT).show() FirebaseAuth.getInstance().SignOut() val намерение = Намерение(действие, SignInActivity::class.java) Способность к началу(намерение) }
но они рекомендуют, чтобы вы могли обрабатывать прослушиватель щелчков в методе onclick в соответствии с архитектурой представления.