2011-01-10 48 views
8

我已經打開了一個錯誤,但我想知道是否有人遇到這個問題,並知道一個解決方法。 如果你定義一個帶有提示的文本視圖,給它右權重(android:gravity =「right」),那麼如果你定義了android:singleLine = true或者android:maxLines =「1」或者android:scrollHorizo​​natally =「true 「你看不到提示。去除右邊的重力會將提示返回到左側,刪除上面提到的所有樹參數會將提示放在右側。我希望我的右邊提示,但我需要一個水平線...提示和textview右權重和單行

這裏的樣本佈局不顯示提示:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:padding="5dp"> 
      <EditText android:layout_width="fill_parent" 
       android:layout_gravity="center_vertical|right" 
       android:layout_height="wrap_content" 
       android:layout_margin="6dp" 
       android:textSize="16sp" 
       android:paddingRight="5dp" 
       android:id="@+id/c" 
       android:gravity="right" 
       android:hint="hello!!!" 
       android:scrollHorizontally="true" 
       android:maxLines="1" 
       android:singleLine="true"/> 
</LinearLayout> 

我查了1.6和2.1模擬器,它重現100%,我prettysure它是一個錯誤,我沒有看到單行和提示之間的連接....更多的提示得到它自己的佈局在TextView中(mLayout和mHintLayout都存在,在onDraw if如果mHint不爲null,則文本長度爲0 mHintLayout)。

回答

5

看起來你完全正確的問題;我試着玩你的示例佈局,看到同樣的問題。我認爲this是你的錯誤報告。

最簡單的解決方案是改變你的佈局,但這可能不是你想要做的。我第一次嘗試解決的辦法是嘗試不在XML中設置這三個屬性中的任何一個,然後將它們設置爲Java。如果這不起作用...

一個選擇是通過擴展EditText類並嘗試修復自己設置提示的代碼或通過重寫onDraw方法來創建提示來模仿提示,或者也許只需在EditText上重疊常規TextView,然後手動顯示/隱藏即可。您甚至可以檢查視圖是否爲空,如果是這樣,請將文本設置爲您的提示文本並更改顏色。當視圖獲得焦點時,檢查其文本是否等於您的提示,如果是,則刪除文本並將顏色改回。

另一個可能的解決方法是多一點「哈克」,是忽略導致問題的三個屬性,但嘗試手動阻止創建新行。你需要創建一個OnKeyListener爲您的EditText,這樣的事情:

editText.setOnKeyListener(new OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) { 
       // do nothing 
       return true; 
      } 
      return false; 
     } 
    }); 

你也想打電話editText.setImeOptions(EditorInfo.IME_ACTION_NEXT)避免顯示返回鍵。它仍然可以通過粘貼或者其他方法在文本字段中創建一個換行符,所以當提交表單時爲了安全起見,您還需要解析和刪除換行符。就水平滾動而言,這也不太可能達到你想要的效果。

+0

我想擴展以及但因爲大多數的TextView和EditText的內部是私人的我不能真正觸摸它們,所以我將不得不創建我自己的提示成員覆蓋setHint和setText,所以我可以把提示我的變量,並顯示在onDraw,一旦點擊完成,我需要以某種方式刪除它。這不是一個簡單的解決方案...... – codeScriber 2011-01-11 14:05:22

+0

這是不是真正的解決方案,我會接受它,直到更好的東西出現,我爲Android打開的錯誤被接受,並被定義爲新錯誤是在答案的鏈接,如果任何1想要遵循 – codeScriber 2011-01-13 13:48:01

0

您對我對這個問題的解決方案有什麼看法?

editText.setOnFocusChangeListener(new OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus == false && StringUtils.isNotBlank(editText.getText().toString())) { 
       editText.setGravity(Gravity.RIGHT); 
      } 
     } 
    }); 

和相應的XML文件:對我來說

<EditText android:id="@+id/the_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="number" android:hint="@string/edit_text_prompt"/> 

正常工作:只有一條線路,沒有輸入鍵可以,讓我看到提示,當我離開這個領域得到了一些輸入後,文本顯示爲右對齊。

+0

我需要用我的代碼來檢查它,但通常不喜歡玩焦點聽衆,因爲焦點是通常在非觸摸模式下獲得的東西,除了像EditText這樣的東西在非觸摸模式中也是卡紙的... 10x無論如何;-) – codeScriber 2011-02-09 21:40:49

14

你試過android:ellipsize="start"?這在過去當我希望我的提示和EditText居中時對我很好。

2

使用這些屬性提示和單行...你可以chnge重力!

  android:gravity="right" 
      android:ellipsize="start" 
      android:imeOptions="actionNext"    
      android:singleLine="true" 
0

它與我工作時,我說:

android:hint="the hint text ..." 
android:singleLine="true" 
android:ellipsize="start" 

,並在我的活動我說:

myedittext.setOnKeyListener(new OnKeyListener() { 
    @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if(keyCode==KeyEvent.KEYCODE_ENTER&&event.getAction()==KeyEvent.ACTION_DOWN){ 
        // do nothing 
        return true; 
       } 
      return false; 
    } 
}); 
1

注意到爲我工作不夠好。當我設置Gravity.right時,光標總是在右側,不能放在單詞的中間。

我嘗試了不同的方法 - 把一套重力的右邊時,沒有文字(或左,它是否適合你),然後讓Android決定最好的方向,一旦用戶輸入了什麼東西

這工作對我來說:

  1. 創建TextWatcher

    private static class FilterTextWatcher implements TextWatcher { 
    
        private WeakReference<Activity> mActivity; 
    
        public FilterTextWatcher(Activity activity) { 
         mActivity = new WeakReference<Activity>(activity); 
        } 
    
        public void afterTextChanged(Editable s) { 
        } 
    
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
        } 
    
        public void onTextChanged(CharSequence s, int start, int before, int count) { 
         if (mActivity.get() == null) 
          return; 
    
         EditText searchTxtBx = mActivity.get().mSearchTxtBx; 
         if (searchTxtBx.getText().toString().length() == 0) 
          searchTxtBx.setGravity(Gravity.RIGHT); 
         else 
          searchTxtBx.setGravity(0); 
        } 
    } 
    
  2. 使用它作爲類成員

    private TextWatcher mFilterTextWatcher = new FilterTextWatcher(this); 
    
  3. onCreate()

    mSearchTxtBx.addTextChangedListener(mFilterTextWatcher); 
    
  4. onDestroy()

    mSearchTxtBx.removeTextChangedListener(mFilterTextWatcher); 
    mFilterTextWatcher = null; 
    
0

我注意到了這個問題,當我的TextView架ATR是:

android:singleLine="true" 
android:gravity="right" 

當我嘗試在該textview上鍊接textview或setMovementMethod(LinkMovementMethod.getInstance())時,文本就消失了。

android:ellipsize="start" 

解決了我的問題,因爲我在我的應用程序中使用阿拉伯語文本。