2011-07-25 9 views
3

私はユーザーに私のために文章を完成させたいと思う状況があります。たとえば、EditTextのヒントに「The last time I」があるとします。通常、ユーザーがEditTextをクリックすると、ヒントは消えますが、私はそれを残しておきたいと思います。さらに、私はテキストを永久的にして、消去できないようにしたいと思います...ユーザーには1つのオプションだけを残して...文章を完成させてください。EditTextの恒久的なヒント

最初の部分はかなり簡単です。ヒントを配置するには、EditTextのsetText()メソッドを使用してください。難しい部分は後者です。 EditTextに、ユーザーが消去できないテキストを表示するにはどうすればよいですか?

答えて

2

コードではできませんでしたか?いくつかのアルゴリズムは、テキストが16文字(「前回の長さ」の長さ)未満の場合はテキストをそのように設定します。したがって、それらをクリックするたびに、消去しようとすると、デフォルトのテキストに戻ります。

また、もう一つのアイデアは、TextViewの右端をEditTextボックスの左端に揃えるだけではなく、ユーザーが別のボックスであることを知らないということです。あなたがテキストを編集したくない場合は、これは最善の解決策です。TextViewにするだけです。

+0

私は最初のアイデアが好きです。私は今それを試しています。 – dfetter88

+0

あなたは正しい方向に私を指摘しました。 'TextWatcher'インターフェースを実装し、' afterTextChanged'メソッドで、最初のX文字が私が望むものかどうかを確認します。もしそうでなければ、それらを修正してください。 – dfetter88

+1

良いアイデアは、ちょうど不思議ではない、なぜあなたはTextViewに "私は最後の時間"を入れたいのですか? – Andrew

0

長さをチェックするだけでは不十分です...「これは本当に私がボックスに入れた長いテキスト "とそれが"最後の時間 "の文字列で始まらなくてもそれを受け入れるだろう。

個人的には、私はおそらく、回避策のチェックの上にTextViewを使用して提案された予防方法に行くだろう。しかし、後でそれを検証する場合は、実際には返された文字列の先頭を確認する必要があります。

+0

ummm ...何ですか?いいえ、そうではありません。あなたの文字列が "The last time I"で始まるかどうかをチェックします。それがあった場合は、何もしません。そうでなければ、それはそれを修正するでしょう。そして、このメソッドは各テキスト交換で呼び出されるので、あなたの例のように物事が不自然になることはありません。テキストは、指定された領域内の短い1文字または1文字のみにすることができます。 – dfetter88

+0

私のチェックは次のようなものです: 'if inputStr.startsWith(startString)'それは長さをチェックしません。 – dfetter88

+0

これは正しいです... startsWith()は私が提案していたことを正確に行います - "返された文字列の先頭を確認してください"。第1の答えが示唆したことはしません "テキストが16文字("最後の時間 "の長さ)未満の場合、そのテキストを設定すると、いくつかのアルゴリズムが好きです。 –

2

説明した問題は、android.text.TextWatcherを使用して解決できます。

public class CompleteSentenceWathcher implements TextWatcher { 

    private final String initialText; 

    private int start; 
    private int after; 
    private int count; 

    public CompleteSentenceWathcher(String initialText) { 
     this.initialText = initialText; 
    } 


    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     this.start = start; 
     this.count = count; 
     this.after = after; 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     if(start < initialText.length()) { 
      if(s.toString().startsWith(initialText)) { 
       return; 
      } 
      if(count >= 1 && after == 0) { 
       if(start+count+1 <= initialText.length()) { 
        s.replace(start, start+count, initialText.substring(start, start+count+1)); 
       } else { 
        s.replace(start, start, initialText.substring(start, start+1)); 
       } 
      } else if(count == 0 && after >= 1) { 
       s.delete(start, start+after); 
      } 
     } 
    } 

} 

EditTextのインスタンスを作成し、TextWatcherを追加します。

EditText editText = new EditText(this); 
     editText.setText("I love"); 
     editText.addTextChangedListener(new CompleteSentenceWathcher(editText.getText().toString())); 
2

私は_PERMANENT_HINT_TEXTは、私は、ユーザーが変更できるようにしたくないEditTextの終わりにテキストがあるInputFilter、でこれを実装しました。うまくいけば、テキストのヒント/ディスエーブルセクションのように見えるように、灰色で表示されるように色の範囲を追加することをお勧めします。これにより、UXが正常に変更されないと自動的に判断し、EditTextの一部(通常は完全に変更可能)が「動作していない」理由だけでは不思議ではありません。この手法では、 InputFilterEditTextに設定された後にテキストをに設定することができました。これは私がEditTextPreferenceで使用して以来の要件でした。

明確にするには、最初の代わりにEditTextの末尾に永続テキストが存在する必要がありましたが、それは私の実装と対称的でなければなりません。

new InputFilter() { 
    @Override 
    public CharSequence filter(CharSequence source, int source_start, int source_end, 
           Spanned destination, int destination_start, int destination_end) { 
     final int protected_text_start = (TextUtils.isEmpty(destination)? source.length() : destination.length()) - _PERMANENT_HINT_TEXT.length(); 
     // Allows input into unprotected region 
     if (source_start + destination_start - source_end < protected_text_start) 
      return null; 
     // Prevents deletion of protected region 
     else if (TextUtils.isEmpty(source)) 
      return destination.subSequence(destination_start, destination_end); 
     // Ignores insertion into protected region 
     else 
      return ""; 
    } 
} 

希望EditTextに追加しEditText.setFilters(new InputFilters[] { /* InputFilter goes here */ };を使用しています。

関連する問題