7

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 に等しいものです。これまでのところ、真に複数行にする (ユーザーが必要に応じて入力できるようにする) か、単一行にしてテキストが折り返されないようにすることができました。テキストの周りの要素の一部が干渉している可能性があります。そのため、ビュー全体を含めました。

誰が何が起こっているのか知っていますか?

4

2 に答える 2

8

これは以前から多くの人を悩ませてきたもので、必要なときに答えが見つかりませんでした。純粋なXMLでは、つまり。マークアップだけでなくプログラミングを使用できる場合は、可能であれば少しハックしてこれを行うことができます。基本的に、複数行の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" />

はい、私はあなたが何を考えているか知っています「しかしねえ、フアンこれはマルチ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;
            }
        });

おそらくコードは非常に簡単に読むことができますが、誰かが説明を必要とする場合に備えて、「oneline-multilinelike」に設定しOnKeyListenerEditTextユーザーがリターンキー(KEYCODE_ENTER)を押すと、イベントに伝播しないように指示しますtrueこのコンテキストでイベントを処理したことを意味するものを返すことによって。

結果:

ここに画像の説明を入力してください

考慮事項

新しい行を入力する方法は、リターンキーを押すことだけではありません。ユーザーは、一部のテキストをコピーして貼り付けると、1行のEditTextに複数行のエントリが表示される可能性があります。心配しないでください!保存する前に値を削除したり、次のようなもので使用したりできます

myData = rawText.replace(System.getProperty("line.separator"), " ");

EditTextビューがたくさんある場合はどうなりますか?

さて、基本的に2つのオプションがあります。1つずつ実行して目を引く、このようなことを実行します。ビューが一覧表示され、各ビューがループします。

//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);
于 2012-05-16T01:56:25.890 に答える