使用下面的以下布局和视图,我无法使EditText et_messageText框正确显示在显示器中。如果我在模拟器中运行此命令,则可以单击该区域并获得“空”选择光标,因此我知道那里存在EditText,但是键盘从不显示,并且我也永远无法获得输入。我在做什么错?
activity_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="viewModel"
type="com.example.project.model.MyViewModel" />
</data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.project.MainActivity">
<com.example.project.view.ChannelHeaderView
android:id="@+id/channelHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" />
<com.example.project.view.MessageInputView
android:id="@+id/message_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" />
</RelativeLayout>
</layout>
在message_input.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="viewModel" type="com.example.project.model.MyViewMOdel" /> </data> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:focusable="true" android:focusableInTouchMode="true" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:id="@+id/iv_send" android:layout_width="20dp" android:layout_height="20dp" android:layout_marginEnd="10dp" android:layout_marginBottom="13dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:srcCompat="@drawable/stream_ic_send" /> <EditText android:id="@+id/et_messageText" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="112dp" android:ems="10" android:inputType="text" android:text="@={viewModel.inputText}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/iv_send" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="1.0" /> </androidx.constraintlayout.widget.ConstraintLayout> </layout>
在MessageInputView.java中
public class MessageInputView extends RelativeLayout { private MessageInputBinding binding; private MyViewModel viewModel; public MessageInputView(Context context) { super(context); binding = initBinding(context); } public MessageInputView(Context context, AttributeSet attrs) { super(context, attrs); binding = initBinding(context); // Focus Listening binding.etMessageText.setOnFocusChangeListener((v, hasFocus) -> { if (hasFocus) { binding.etMessageText.setTextIsSelectable(true); InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(v,InputMethodManager.SHOW_FORCED); } }); } private MessageInputBinding initBinding(Context context) { LayoutInflater inflater = LayoutInflater.from(context); binding = MessageInputBinding.inflate(inflater, this, true); binding.etMessageText.clearFocus(); return binding; } public void setViewModel(MyViewMOdel model, LifecycleOwner lifecycleOwner) { this.viewModel = model; binding.setLifecycleOwner(lifecycleOwner); binding.setViewModel(viewModel); } }
最后是在MainActivity.java的onCreate()中
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.setLifecycleOwner(this);
viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
viewModel.setPreferences(this);
binding.setViewModel(viewModel);
binding.channelHeader.setViewModel(viewModel, this);
binding.messageInput.setViewModel(viewModel, this);
使用下面的以下布局和视图,我无法使EditText et_messageText框正确显示在显示器中。如果我在模拟器中运行此程序,则可以单击该区域并获得“ ...
要在ConstraintLayout中定义视图的位置,必须至少添加视图的一个水平约束和一个垂直约束。每约束表示与另一个视图的连接或对齐,父级布局或不可见的准则。每个约束定义视图沿垂直或水平轴的位置;所以每个视图必须对每个轴至少有一个约束,但是通常还有更多必要。