세트 가있는 EditText위젯 을 동시에 가질 수 있습니까?android:inputType="textMultiLine"android:imeOptions="actionDone"
키보드의 작업 버튼이 Enter (캐리지 리턴)가 아닌 완료로 된 여러 줄 편집 상자를 원하지만 작동하지 않는 것 같습니다 ..
미리 감사드립니다
세트 가있는 EditText위젯 을 동시에 가질 수 있습니까?android:inputType="textMultiLine"android:imeOptions="actionDone"
키보드의 작업 버튼이 Enter (캐리지 리턴)가 아닌 완료로 된 여러 줄 편집 상자를 원하지만 작동하지 않는 것 같습니다 ..
미리 감사드립니다
답변:
사용하다
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
그리고 XML :
android:inputType="textMultiLine"
textField.setCursorVisible(false);내부 에 추가해야 했습니다onEditorActionListener
Android 문서에서 : ' "textMultiLine"사용자가 줄 바꿈 (캐리지 리턴) 을 포함하는 긴 텍스트 문자열을 입력 할 수있는 일반 텍스트 키보드 . '따라서 키보드에서'완료 '버튼을 사용하려는 경우 textMultiLine 속성이 적합하지 않습니다.
done 버튼으로 여러 줄 (이 경우 3 줄) 입력 필드를 얻는 간단한 방법은 다음과 함께 EditText를 사용하는 것입니다.
android:lines="3"
android:scrollHorizontally="false"
그러나 어떤 이유로 이것은 레이아웃 파일 (onCreate에서) 대신 코드에서 이러한 설정을 수행하는 경우에만 작동합니다.
TextView tv = (TextView)findViewById(R.id.editText);
if (tv != null) {
tv.setHorizontallyScrolling(false);
tv.setLines(3);
}
알아내는 데 시간이 꽤 걸렸기 때문에 누군가에게 도움이되기를 바랍니다. 매니페스트에서 작동하도록하는 방법을 찾으면 알려주십시오.
maxLines()대신에 setLines()당신의 높이를 변경하는 것을 방지하려면EditText
setMaxLines(3)) 감사합니다!
작업 예! 이 기능을 지원하는 아래 사용자 정의 EditText 클래스를 만들고 xml 파일의 클래스를 사용합니다. 작동 코드 :
package com.example;
import android.content.Context;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;
public class ActionEditText extends EditText
{
public ActionEditText(Context context)
{
super(context);
}
public ActionEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public ActionEditText(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs)
{
InputConnection conn = super.onCreateInputConnection(outAttrs);
outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
return conn;
}
}
<com.example.ActionEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:inputType="textAutoCorrect|textCapSentences|textMultiLine" />
Kotlin에서이 작업을 수행하려면 (선택적 textCapSentences으로이 확장 기능을 사용할 수있는 다른 구성을 적용 할 수도 있습니다.)
// To use this, do NOT set inputType on the EditText in the layout
fun EditText.setMultiLineCapSentencesAndDoneAction() {
imeOptions = EditorInfo.IME_ACTION_DONE
setRawInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES or InputType.TYPE_TEXT_FLAG_MULTI_LINE)
}
용법:
myEditText.setMultiLineCapSentencesAndDoneAction()
setRawInputType대신 사용하는 것이 었습니다setInputType
나는 이것이 당신의 일을하는 방법이라고 생각합니다. 데 android:inputType="textMultiLine", android:imeOptions="actionDone"차종은 키 기능이 모호한 입력합니다. 을 (를) 사용 android:lines="10"하고 제거 할 수 있다는 점을 명심 하십시오 android:inputType="textMultiLine". 그러나 달성하려는 내용에 따라를 필요로하며 android:inputType="textMultiLine"대체 할 수 없습니다.
EditText ed=new EditText(this);
ed.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_ENTER){
//do your stuff here
}
return false;
}
});
코드에서 이러한 값 을 설정하는 것이 저에게 효과적이었습니다.
edittext.inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
edittext.setHorizontallyScrolling(false)
edittext.maxLines = Integer.MAX_VALUE // Or your preferred fixed value
나는 이것을 자주 요구하므로 코드를 깨끗하게 유지하기 위해 이것을 만들었습니다.
fun EditText.multilineIme(action: Int) {
imeOptions = action
inputType = EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
setHorizontallyScrolling(false)
maxLines = Integer.MAX_VALUE
}
// Then just call
edittext.multilineIme(EditorInfo.IME_ACTION_DONE)
'완료'에 선택적 사용자 지정 작업을 추가하려면 다음을 시도하십시오.
fun EditText.multilineDone(callback: (() -> Unit)? = null) {
val action = EditorInfo.IME_ACTION_DONE
multilineIme(action)
setOnEditorActionListener { _, actionId, _ ->
if (action == actionId) {
callback?.invoke()
true
}
false
}
}
}
// Then you can call
edittext.multilineDone { closeKeyboard() }
// or just
edittext.multilineDone()
콜백에서 키보드를 쉽게 제어해야합니까? 이 게시물 읽기
그런 다음 hideKeyboard()전화 추가EditText.multilineDone
짧은 답변 : 아니요, API 레벨 11 (3.0) 이전에는 불가능하다고 생각합니다.
동일한 문제가 여기에서 발생했습니다 (수락 된 답변에 대한 의견에서 논의 됨).
마지막 댓글에서 :
내 휴대 전화의 몇 가지 앱을 보면 여러 줄 상자가 마지막에 표시되고 그 아래에 "완료"또는 "보내기"버튼이 표시되는 것이 일반적입니다 (예 : 이메일 앱).
이 상황을 해결하는 간단한 방법 :
이 속성을 EditText에 유지하십시오.
android:inputType="textMultiLine"
android:scrollHorizontally="false"그런 다음 ENTER를 누를 때만 키보드를 숨기려면 다음 코드를 추가하십시오.
editText.setOnEditorActionListener(new OnEditorActionListener()
{
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
{
editText.setSelection(0);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
return true;
}
else
{
return false;
}
}
});다른 솔루션 중 어느 것도 나를 위해 일한 적이 없었지만 다음 은 아름답게 작동했으며 물론 몇 가지 왜곡을 통해 더 많은 인터넷 검색을 할 수있게되었습니다. 불행히도 내가 코드를 어디서 얻었는지 기억하지 못하기 때문에 저자에게 그럴만 한 가치가있는 크레딧을 줄 수 없습니다.
Java 코드에서 :
////////////Code to Hide SoftKeyboard on Enter (DONE) Press///////////////
editText.setRawInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD|InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
editText.setImeActionLabel("DONE",EditorInfo.IME_ACTION_DONE); //Set Return Carriage as "DONE"
editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
{
if (event == null) {
if (actionId == EditorInfo.IME_ACTION_DONE) {
// Capture soft enters in a singleLine EditText that is the last EditText
// This one is useful for the new list case, when there are no existing ListItems
editText.clearFocus();
InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
}
else if (actionId == EditorInfo.IME_ACTION_NEXT) {
// Capture soft enters in other singleLine EditTexts
} else if (actionId == EditorInfo.IME_ACTION_GO) {
} else {
// Let the system handle all other null KeyEvents
return false;
}
}
else if (actionId == EditorInfo.IME_NULL) {
// Capture most soft enters in multi-line EditTexts and all hard enters;
// They supply a zero actionId and a valid keyEvent rather than
// a non-zero actionId and a null event like the previous cases.
if (event.getAction() == KeyEvent.ACTION_DOWN) {
// We capture the event when the key is first pressed.
} else {
// We consume the event when the key is released.
return true;
}
}
else {
// We let the system handle it when the listener is triggered by something that
// wasn't an enter.
return false;
}
return true;
}
});
나는 4.x에 있고 setHorizontallyScrolling () (setLine () 또는 setMaxLines ()의 유무에 관계없이) 호출을 시도했으며 Done 버튼을 표시하기 위해 다양한 XML 구성을 시도했습니다. 그들 중 누구도 일하지 않았습니다. 요점은 EditText가 여러 줄인 경우 Android는이 문제를 해결하지 않는 한 항상 "Done"버튼 대신 캐리지 리턴을 표시하려고합니다.
캐리지 리턴의 동작을 다시 매핑하지 않는 가장 복잡한 솔루션은 https://stackoverflow.com/a/12570003/3268329 입니다. 이 솔루션은 여러 줄보기에 대해 IME_FLAG_NO_ENTER_ACTION 플래그를 강제로 설정하려는 Android의 끊임없는 욕구를 무효화하여 Done 버튼이 사라집니다.
나는 꽤 오랫동안 고생했지만 마침내 해결책을 찾았습니다!
다음과 같이 사용자 정의 EditText 클래스를 만드십시오.
public class EditTextImeMultiline extends EditText {
public void init() {
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
for (int i = s.length(); i > 0; i--)
if (s.subSequence(i - 1, i).toString().equals("\n"))
s.replace(i - 1, i, "");
}
});
setSingleLine();
setHorizontallyScrolling(false);
this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
EditTextImeMultiline.this.setLines(EditTextImeMultiline.this.getLineCount());
}
});
}
public EditTextImeMultiline(Context context) {
super(context);
init();
}
public EditTextImeMultiline(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public EditTextImeMultiline(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
}
이 클래스는 lineBreaks (\ n)를 제거하고 textMultiline처럼 텍스트를 래핑하며 Enter 버튼을 ImeAction;)으로 대체 할 수 있습니다.
클래식 EditText 클래스 대신 XML에서 호출하기 만하면됩니다.
여기에 논리를 설명하려면 :
작업 솔루션이 여기에 있습니다. 사용자 지정 EditTextView를 만들고 (텍스트보기를 확장하기 만하면) 여기에 허용 된 답변에서 찾을 수있는 코드 조각으로 onInputConnection을 재정의합니다. 2.3에서 Done SoftInput Action Label이있는 Multiline EditText