在android中将文本视图中的文本编辑为编辑文本

在android中将文本视图中的文本编辑为编辑文本,android,Android,我不知道我的EditText到底发生了什么 我有一个文本视图,一个编辑文本和一个按钮 所需的逻辑是: 单击按钮时,使用文本视图的内容设置编辑文本。 单击“完成”后,文本视图将显示编辑文本的内容 这是我目前的代码: speech_text = (TextView) findViewById(R.id.speech); speech_text_edit = (EditText) findViewById(R.id.speech_edit); editB

我不知道我的EditText到底发生了什么

我有一个文本视图,一个编辑文本和一个按钮

所需的逻辑是: 单击按钮时,使用文本视图的内容设置编辑文本。 单击“完成”后,文本视图将显示编辑文本的内容

这是我目前的代码:

        speech_text = (TextView) findViewById(R.id.speech);
        speech_text_edit = (EditText) findViewById(R.id.speech_edit);
        editBTN= (Button) findViewById(R.id.edit);
        editBTN.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            speech_text_edit.setText(speech_text.getText().toString());
            speech_text.setVisibility(View.GONE);
            speech_text_edit.setVisibility(View.VISIBLE);
            //open keyboard
            InputMethodManager show_imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            show_imm.showSoftInput(editBTN, InputMethodManager.SHOW_IMPLICIT);

            speech_text_edit.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                @Override
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                      speech_text.setText(speech_text_edit.getText().toString());
                        speech_text_edit.setVisibility(View.GONE);
                        speech_text.setVisibility(View.VISIBLE);
                        speech_text_edit.setFocusable(false);

                        //close keyboard
                        InputMethodManager hide_imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                        hide_imm.hideSoftInputFromWindow(editBTN.getWindowToken(), 0);
                    }
                    return true;
                }
            });
        }
    });
布局代码:

<TextView
    android:id="@+id/speech"
    android:layout_width="match_parent"
    android:layout_height="350dp"
    android:layout_margin="25dp" android:layout_marginBottom="150dp"
    android:textSize="25sp" android:textAlignment="inherit"
    android:background="@drawable/curved_background"
    android:textIsSelectable="true"
    android:padding="10dp" android:visibility="visible"
    />

<EditText
    android:layout_width="match_parent"
    android:layout_height="350dp"
    android:id="@+id/speech_edit"
    android:background="@drawable/curved_background"
    android:imeActionLabel="actionDone"
    android:visibility="gone"
    android:textSize="25sp"
    android:layout_margin="25dp" android:layout_marginBottom="150dp"
    android:inputType="textAutoCorrect"
    android:layout_gravity="top"
    android:focusable="true"/>
TL;博士 在显示键盘之前

InputMethodManager#showSoftInput( FOCUSED_VIEW, 0 );
除去

TextView.setFocusable(false);
聚焦的
视图
应该是您的
speed\u edit\u文本
!不是按钮

还要确保设置了
EditText
的以下属性以启用多行输入:

android:inputType="textAutoCorrect|textMultiLine"
android:layout_gravity="top"
android:lines="8"
android:gravity="top|start"
android:minLines="6"
android:maxLines="10"
android:scrollbars="vertical"
“最小”、“最大”和“线”值是任意数,但可以使用该值设置长方体高度的域

关于焦点 问题是您对
TextView#setFocusable(false)
的调用。当您将其设置为false时,您也会对该元素失去焦点。所以现在当你再次显示它时,Android不知道为什么要显示键盘(因为显示时,
EditText
没有自动聚焦)。因为你隐藏了视图,你真的不需要让它不可聚焦,它已经消失了,所以不能聚焦

  • 当您要显示键盘时,为要编辑的视图请求焦点(
    view#requestFocus
  • 显示聚焦视图的键盘
  • 完成后,隐藏键盘
  • 清除焦点或隐藏具有焦点的元素(这就是您要做的)(
    查看#clearFocus
关于InputManager 可以使用以下三个值之一显示键盘:

  • 0:这是an
    EditText
  • 1(
    SHOW\u IMPLICIT
    ):这不是用户直接请求的
  • 2(
    SHOW\u FORCED
    ):强制显示,直到用户“强制”关闭
可以使用以下三个值之一隐藏键盘:

  • 0:这是an
    EditText
  • 1:(
    HIDE\u IMPLICIT
    ):如果使用
    SHOW\u IMPLICIT
  • 2:(
    HIDE\u不总是
    ):隐藏它,除非它是用
    SHOW\u强制显示的

然而,你可以强迫你想要的一切。如果某个元素不可聚焦,则无法通过显示键盘获得自动聚焦。

我不想限制行号。我想把文本从编辑文本的开头开始,我没听清你的问题。您有1个Textview、EditText和Button,然后单击按钮将Textview的文本设置为EditText,然后再次单击按钮将EditText的文本设置为Textview。这是对的吗?半是/否。我的意思是“第二次点击”是再次重复策略-从文本视图传递文本以再次编辑文本。但没有软键盘和指针。因为TextView用于显示文本。若你们点击编辑文本,你们会得到键盘。我还是不明白你想说什么。好吧,我再解释一遍。电视上写着“你好”。单击editBTN。E.T.用键盘和指针显示“你好”。我把它编辑成“你好,世界”。点击完成BTN,电视显示“Hello world”。没关系。现在,我再次单击editBTN。E.T.也会显示“Hello world”,但软键盘和指针不会显示/开始。您的logcat没有错误,所以我不确定您想显示什么好,我再次解释。电视上写着“你好”。单击editBTN。E.T.用键盘和指针显示“你好”。我把它编辑成“你好,世界”。点击完成BTN,电视显示“Hello world”。没关系。现在,我再次单击editBTN。E.T.也会显示“Hello world”,但软键盘和指针不会显示/开始。
setFocusable(false)
会阻止您再次输入编辑文本。很好!谢谢。但当我使用
textMultiLine
Done键时,它就消失了!你建议我使用动作模式来完成任务还是做其他事情。(将文本从编辑文本传递到文本视图)是。如果使用IME操作,则“完成”不会被替换,而是隐藏在长按“回车”键时。我建议您不要隐藏编辑按钮,而是将编辑按钮更改为“完成”按钮。基本上:如果编辑:编辑按钮完成。如果不编辑:编辑按钮是转到edit.Ya。我更喜欢有“回车”键。我会把它放在我的键盘上。。。但是完成编辑过程怎么样?一定有什么东西可以隐藏软键板。我该怎么做,请给我你的建议?是的,我会有一个额外的按钮,你可以点击来完成(保存,完成,无论什么),带有一个隐藏键盘的
OnClickListener
,或者改变编辑按钮的图形,改变你点击它时的行为。第一件事对你来说可能更容易。
InputMethodManager#showSoftInput( FOCUSED_VIEW, 0 );
TextView.setFocusable(false);
android:inputType="textAutoCorrect|textMultiLine"
android:layout_gravity="top"
android:lines="8"
android:gravity="top|start"
android:minLines="6"
android:maxLines="10"
android:scrollbars="vertical"