Android EditText不可见,并且不显示键盘

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

使用下面的以下布局和视图,我无法使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框正确显示在显示器中。如果我在模拟器中运行此程序,则可以单击该区域并获得“ ...

android android-layout android-databinding 2-way-object-databinding
1个回答
0
投票

要在ConstraintLayout中定义视图的位置,必须至少添加视图的一个水平约束和一个垂直约束。每约束表示与另一个视图的连接或对齐,父级布局或不可见的准则。每个约束定义视图沿垂直或水平轴的位置;所以每个视图必须对每个轴至少有一个约束,但是通常还有更多必要。

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