Android Edittext正在获得焦点,并在AlertDialog解除后显示键盘
我在片段和AlertDialog中有一个EditText。我正在使用编辑文本,然后单击完成按钮。但每当我关闭AlertDialog时,Edittext就会获得焦点并显示键盘。我不想在AlerDialog关闭后显示键盘。我如何解决这个问题 在关闭AlertDialog后,我使用Android Edittext正在获得焦点,并在AlertDialog解除后显示键盘,android,android-studio,kotlin,android-edittext,android-textinputedittext,Android,Android Studio,Kotlin,Android Edittext,Android Textinputedittext,我在片段和AlertDialog中有一个EditText。我正在使用编辑文本,然后单击完成按钮。但每当我关闭AlertDialog时,Edittext就会获得焦点并显示键盘。我不想在AlerDialog关闭后显示键盘。我如何解决这个问题 在关闭AlertDialog后,我使用val imm=getSystemService(Context.INPUT\u METHOD\u SERVICE)作为InputMethodManager imm.hideSoftInputFromWindow(view
val imm=getSystemService(Context.INPUT\u METHOD\u SERVICE)作为InputMethodManager imm.hideSoftInputFromWindow(view.windowToken,0)
,但它不起作用
main.kt
import android.app.AlertDialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavDirections
import androidx.navigation.Navigation
import com.martiandeveloper.decisionmaker.R
import com.martiandeveloper.decisionmaker.databinding.DialogOptionBinding
import com.martiandeveloper.decisionmaker.databinding.FragmentMainBinding
import com.martiandeveloper.decisionmaker.viewmodel.MainViewModel
import timber.log.Timber
class MainFragment : Fragment() {
private lateinit var fragmentMainBinding: FragmentMainBinding
private lateinit var mainViewModel: MainViewModel
private lateinit var optionDialog: AlertDialog
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
fragmentMainBinding =
DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
return fragmentMainBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initUI()
}
private fun initUI() {
mainViewModel = getViewModel()
fragmentMainBinding.mainViewModel = mainViewModel
fragmentMainBinding.lifecycleOwner = this
observe()
optionDialog = AlertDialog.Builder(context).create()
}
private fun getViewModel(): MainViewModel {
return ViewModelProvider(this, object : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return MainViewModel() as T
}
})[MainViewModel::class.java]
}
private fun navigate(navDirections: NavDirections) {
view?.let { Navigation.findNavController(it).navigate(navDirections) }
}
private fun observe() {
mainViewModel.eventOptionMBTNClick.observe(viewLifecycleOwner, {
if (it) {
mainViewModel.setIsOptionDialogShowing(true)
mainViewModel.onOptionMBTNClickComplete()
}
})
mainViewModel.eventDecideMBTNClick.observe(viewLifecycleOwner, {
if (it) {
Timber.i("Decide")
mainViewModel.onDecideMBTNClickComplete()
}
})
mainViewModel.eventCancelMBTNClick.observe(viewLifecycleOwner, {
if (it) {
mainViewModel.setIsOptionDialogShowing(false)
mainViewModel.onCancelMBTNClickComplete()
}
})
mainViewModel.eventDoneMBTNClick.observe(viewLifecycleOwner, {
if (it) {
Timber.i("Done")
mainViewModel.onDoneMBTNClickComplete()
}
})
mainViewModel.isOptionDialogShowing.observe(viewLifecycleOwner, {
if (it) {
showOptionDialog()
} else {
if (optionDialog.isShowing) {
optionDialog.dismiss()
}
}
})
}
private fun showOptionDialog() {
val binding = DialogOptionBinding.inflate(LayoutInflater.from(context))
binding.mainViewModel = mainViewModel
binding.lifecycleOwner = this
binding.dialogOptionOptionET.requestFocus()
optionDialog.setView(binding.root)
optionDialog.setCanceledOnTouchOutside(false)
optionDialog.setCancelable(false)
optionDialog.show()
val window = optionDialog.window
window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}
}
导入android.app.AlertDialog
导入android.os.Bundle
导入android.view.LayoutInflater
导入android.view.view
导入android.view.ViewGroup
导入android.view.WindowManager
导入androidx.databinding.DataBindingUtil
导入androidx.fragment.app.fragment
导入androidx.lifecycle.ViewModel
导入androidx.lifecycle.ViewModelProvider
导入androidx.navigation.NavDirections
导入androidx.navigation.navigation
导入com.martiandeveloper.decisionmaker.R
导入com.martiandeveloper.decisionmaker.databinding.DialogOptionBinding
导入com.martiandeveloper.decisionmaker.databinding.FragmentMainBinding
导入com.martiandeveloper.decisionmaker.viewmodel.MainViewModel
进口木材
类MainFragment:Fragment(){
私有lateinit var fragmentMainBinding:fragmentMainBinding
私有lateinit var mainViewModel:mainViewModel
私有lateinit变量optionDialog:AlertDialog
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看{
碎片装订=
数据绑定器充气(充气器,右布局,主容器,假)
返回fragmentMainBinding.root
}
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
initUI()
}
私人娱乐initUI(){
mainViewModel=getViewModel()
fragmentMainBinding.mainViewModel=mainViewModel
fragmentMainBinding.lifecycleOwner=此
遵守
optionDialog=AlertDialog.Builder(context.create())
}
private fun getViewModel():MainViewModel{
返回ViewModelProvider(此对象:ViewModelProvider.Factory{
重写趣味创建(modelClass:Class):T{
@抑制(“未选中的_CAST”)
将MainViewModel()返回为T
}
})[MainViewModel::class.java]
}
私人娱乐导航(导航方向:导航方向){
查看?.let{Navigation.findNavController(it).导航(navDirections)}
}
私人娱乐{
mainViewModel.EventOptions单击.observe(viewLifecycleOwner{
如果(它){
mainViewModel.setIsOptionDialogShowing(真)
mainViewModel.onOptionMBTNClickComplete()
}
})
mainViewModel.eventDecideMBTNClick.observe(viewLifecycleOwner{
如果(它){
木材。我(“决定”)
mainViewModel.onDecideMBTNClickComplete()的
}
})
mainViewModel.eventCancelMBTNClick.observe(viewLifecycleOwner{
如果(它){
mainViewModel.setIsOptionDialogShowing(假)
mainViewModel.onCancelMBTNClickComplete()的
}
})
mainViewModel.eventDoneMBTNClick.observe(viewLifecycleOwner{
如果(它){
i.木材(“完成”)
mainViewModel.onDoneMBTNClickComplete()
}
})
mainViewModel.isOptionDialogShowing.observe(viewLifecycleOwner{
如果(它){
showOptionDialog()
}否则{
如果(可选对话显示){
optionDialog.Disclose()
}
}
})
}
私人娱乐节目选项对话(){
val binding=对话框OPTIONBINDING.FILLATE(LAYOUTIONFLATER.from(上下文))
binding.mainViewModel=mainViewModel
binding.lifecycleOwner=此
binding.dialogOptionOptionET.requestFocus()
optionDialog.setView(binding.root)
optionDialog.setCanceledOnTouchOutside(假)
optionDialog.setCancelable(假)
optionDialog.show()
val窗口=optionDialog.window
window?.clearFlags(WindowManager.LayoutParams.FLAG\u不可聚焦或
WindowManager.LayoutParams.FLAG\u ALT\u FOCUSABLE\u IM)
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT\u输入\u状态\u始终可见)
}
}
fragment_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="mainViewModel"
type="com.martiandeveloper.decisionmaker.viewmodel.MainViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".view.MainFragment">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/fragment_main_mainTIL"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:textColorHint="@color/woodland"
app:boxStrokeColor="@color/woodland"
app:hintAnimationEnabled="false"
app:hintTextColor="@color/woodland"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/background"
android:fontFamily="@font/actor"
android:hint="@string/ask_me_your_question_here"
android:imeOptions="actionDone"
android:inputType="text"
android:text="@={mainViewModel.questionET}"
android:textColor="@color/apple_white"
android:textColorHint="@color/woodland" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/fragment_main_optionsMTV"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:fontFamily="@font/actor"
android:text="@string/options"
android:textColor="@color/woodland"
app:layout_constraintEnd_toEndOf="@id/fragment_main_mainTIL"
app:layout_constraintStart_toStartOf="@id/fragment_main_mainTIL"
app:layout_constraintTop_toBottomOf="@id/fragment_main_mainTIL" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toTopOf="@id/fragment_main_buttonsLL"
app:layout_constraintTop_toBottomOf="@id/fragment_main_optionsMTV">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/actor"
android:textColor="@color/apple_white"
android:textSize="18sp" />
</ScrollView>
<LinearLayout
android:id="@+id/fragment_main_buttonsLL"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:backgroundTint="@color/antarctic_deep"
android:fontFamily="@font/actor"
android:onClick="@{() -> mainViewModel.onOptionMBTNClick()}"
android:text="@string/option"
android:textAllCaps="false"
android:textColor="@color/apple_white"
app:cornerRadius="0dp"
app:icon="@drawable/ic_option"
app:iconTint="@color/moorland_mist"
app:strokeColor="@color/woodland"
app:strokeWidth="1dp" />
<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:backgroundTint="@color/antarctic_deep"
android:fontFamily="@font/actor"
android:onClick="@{()->mainViewModel.onDecideMBTNClick()}"
android:text="@string/decide"
android:textAllCaps="false"
android:textColor="@color/apple_white"
app:cornerRadius="0dp"
app:icon="@drawable/ic_decide"
app:iconTint="@color/moorland_mist"
app:strokeColor="@color/woodland"
app:strokeWidth="1dp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
dialog_option.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="mainViewModel"
type="com.martiandeveloper.decisionmaker.viewmodel.MainViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/moorland_mist"
android:orientation="vertical"
android:padding="16dp">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/dialog_option_optionET"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="@color/woodland"
app:boxStrokeColor="@color/woodland"
app:hintAnimationEnabled="false"
app:hintTextColor="@color/woodland">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/background"
android:fontFamily="@font/actor"
android:hint="@string/enter_your_option_here"
android:imeOptions="actionDone"
android:inputType="text"
android:text="@={mainViewModel.optionET}"
android:textColor="@color/apple_white"
android:textColorHint="@color/woodland" />
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:backgroundTint="@color/antarctic_deep"
android:fontFamily="@font/actor"
android:onClick="@{() -> mainViewModel.onCancelMBTNClick()}"
android:text="@string/cancel"
android:textAllCaps="false"
android:textColor="@color/apple_white"
app:cornerRadius="0dp"
app:icon="@drawable/ic_cancel"
app:iconTint="@color/moorland_mist"
app:strokeColor="@color/woodland"
app:strokeWidth="1dp" />
<com.google.android.material.button.MaterialButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:backgroundTint="@color/antarctic_deep"
android:fontFamily="@font/actor"
android:onClick="@{()->mainViewModel.onDoneMBTNClick()}"
android:text="@string/done"
android:textAllCaps="false"
android:textColor="@color/apple_white"
app:cornerRadius="0dp"
app:icon="@drawable/ic_done"
app:iconTint="@color/moorland_mist"
app:strokeColor="@color/woodland"
app:strokeWidth="1dp" />
</LinearLayout>
</LinearLayout>
</layout>