我知道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>
我想要拥有此行为的文本是id等于@ + id / edit_question_value的文本。到目前为止,我已经能够使它成为真正的多线(因此用户可以输入,如果他想要)或单行,文本将不会换行。也许文本周围的一些元素有一些干扰,这就是为什么我把整个视图包括在内。
有谁知道发生了什么事?
答案 0 :(得分:8)
以前很多人一直困扰着我,在我需要的时候找不到答案。在纯XML中,即。如果我们可以使用编程而不仅仅是标记,那么如果可以的话,我们可以通过一些 hack 来实现。基本上,我们声明一个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" />
是的,我知道你在想什么“但是,嘿, Juan 这是一个多线人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;
}
});
您可以很容易地阅读代码,但是如果有人需要解释,我们将OnKeyListener
设置为EditText
我们希望“online-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);
答案 1 :(得分:-1)
s = re.sub(r'(:\s+")(.*(?:\n(?!\s*"[^"\n:]+":).*)*)",$', lambda x: '{}{}",'.format(x.group(1), x.group(2).replace('"', "''")), s, flags=re.M)
尝试一下。当我将重力更改为上|左时为我工作