Raf*_*ael 7 android view android-edittext
我知道Stackoverflow中有很多相关的问题,但是我尝试用其中任何一个编写的所有内容,到目前为止,我无法使用它.
我的问题很简单.我有一个Android应用程序,我有一个用户将输入文本的框.但是,我不希望这个文本是多行的(它不应该有"\n"),但如果行的大小大于视口,我希望它包装.所以基本上,我想要的是与Gmail主题字段上的textBox相同的行为.
这是我的全部观点:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/question"
android:textAppearance="@style/titleFont"/>
<EditText
android:id="@+id/edit_question_value"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.3"
android:gravity="top"
android:inputType="textImeMultiLine|textEmailSubject"
android:maxLength="70"
>
</EditText>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/answer"
android:textAppearance="@style/titleFont"/>
<EditText
android:id="@+id/edit_question_answer"
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="top"
android:layout_weight="0.7"
android:inputType="textMultiLine"/>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<Button
android:id="@+id/save_question"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_weight="0.5"
android:text="@string/save"/>
<Button
android:id="@+id/cancel_edit_question"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:text="@string/cancel"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我想要具有此行为的文本是id等于@ + id/edit_question_value的文本.到目前为止,我已经能够使它成为真正的多线(因此用户可以输入,如果他想要)或单行,文本将不会换行.也许文本周围的一些元素有一些干扰,这就是为什么我包括整个视图.
有谁知道发生了什么?
这件事以前困扰了很多人,在我需要的时候找不到答案.在纯XML中,即.如果我们可以使用编程而不仅仅是标记,那么如果可以的话,我们可以通过一点点破解来实现.基本上,我们声明一个multiLine editText,然后捕获返回键以避免换行.
首先是xml中的声明:
<EditText
android:id="@+id/noReturnEditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:imeOptions="actionDone"
android:inputType="textMultiLine|textCapSentences"
android:text="lorem ipsum \n dolor site amet helping stackoverflow" />
Run Code Online (Sandbox Code Playgroud)
是的,我知道你在想什么"但是,嘿,胡安这是一个多线人EditText,我想要一个像gmail的主题区域一样的班轮".我知道,我知道,但我们要照顾它,现在,通过删除不想要的多部分的行为,同时保持我们的文本换行不想要的.
现在剩下的代码:
EditText noReturnEditText = (EditText) findViewById(R.id.noReturnEditText);
noReturnEditText.setOnKeyListener(new OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) return true;
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
您可以很容易地阅读代码,但是如果有人需要解释,我们设置OnKeyListener为EditText我们希望"oneline-multilinelike",如果用户按下返回键(KEYCODE_ENTER),我们告诉事件不要传播通过返回true,在这种情况下,我们已经处理了事件.
结果:

注意事项
按返回键不是输入新行的唯一方法.用户可以复制/粘贴一些文本,最后在单行EditText上使用多行条目.不要担心!我们可以在存储它之前剥离它,或者将它用于类似的东西
myData = rawText.replace(System.getProperty("line.separator"), " ");
如果我有很多EditText观点怎么办?
嗯,你基本上有两种选择.一个接一个地做,拉出你的眼睛或做这样的事情,它列出每个视图的视图和循环.
//Declare the reusable listener
OnKeyListener myListener = new OnKeyListener(){
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_ENTER) return true;
return false;
}
}
//Loop through the views
int viewIds[] = {R.id.edittext1,R.id.edittext2,R.id.edittext3,R.id.edittext4};
for(int id : viewIds) ((EditText)findViewById).setOnKeyListener(myListener);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5447 次 |
| 最近记录: |