2012-01-23 42 views
1

我試圖創建一個ListView(定製CursorAdapter)的EditText項目,使得EditTexts出現在第一不可修改成爲在長按可編輯。然後,用戶將編輯EditText內容,EditText會在失去焦點時保存對db的更改。然而,我遇到了一個非常討厭的行爲,這使我無法做到這一點。ListView的項目主要集中行爲

1)我已經將XML文件中的EditTexts設置爲android:focusable="false"android:focusableInTouchMode="false"

2)我已經創建了一個我ListActivityOnItemLongClickListener,做以下操作:

public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 
{ 
    Log.d("NLAc", "longClick called"); 
    EditText et = (EditText) view.findViewById(R.id.etFolderName); 
    et.setFocusable(true); 
    et.setFocusableInTouchMode(true); 
    return true; 
} 

3)當我創建我的適配器的觀點我附上以下焦點變化監聽器:

public void onFocusChange(View v, boolean hasFocus) 
{ 
    if (hasFocus) 
{ 
    EditText et = (EditText)v; 
    Log.d(TAG, "hasFocus true called " + et.getText()); 
    et.setText("focused"); 
    et.setSelection(et.length()); 
} 
else 
{ 
    EditText et = (EditText)v; 
    Log.d(TAG, "hasFocus false called " + et.getText()); 
    et.setText("unfocused"); 
    et.setFocusableInTouchMode(false); 
      //TODO Save to DB 
} 

}

會發生什麼事是,當我長單擊第一個項目,我得到日誌中的以下內容:

longClick called

hasFocus true called item1

hasFocus false called focused

如果我刪除線設置可聚焦於假(et.setFocusableInTouchMode(false);)我得到另一個hasFocus true called unfocused。 顯然,事情是這樣的:

1)EditText獲取設置可聚焦含

2)LinearLayourListView失去焦點,並在所有調用內部unFocus()時注重它的孩子,包括我的EditText

3)EditText損失焦點

4)EditText焦點 - 無論出於何種原因。

此行爲阻止我在失去焦點或使其無法對焦之前禁用EditText,直到下一次長時間點擊發生,這正是我想要的。 任何人都可以建議我可能會失蹤?或者解釋這種行爲?任何解決方案讚賞

+0

你確定這樣保存用戶輸入是件好事嗎?您通常會有一個按鈕來保存用戶的輸入數據,並進一步與您的數據流一起。或者在活動開始時保存它.Pause()或用戶離開活動。它會爲你節省一大堆時間並避免痛苦。只是說... –

+0

我在考慮添加一個「完成」按鈕,但我真的希望能夠保存任何東西,比如失去焦點或在軟鍵盤上輸入。 –

+1

我明白,但我真的會建議看http://ux.stackexchange.com/questions/8868/best-practices-for-uidesign-on-android-usability-ux,當然在http://www.androidpatterns .com和這裏去你的ENTER軟KB按鈕http://stackoverflow.com/questions/4451374/use-enter-key-on-softkeyboard-instead-of-clicking-button –

回答

2

我能夠通過在彼此之上使用兩個視圖取得一些進展。我正在使用TextView進行未聚焦的顯示,並且隱藏它並顯示EditText而不是長按。但是,這並沒有真正幫助ListView的真正奇怪的焦點處理,直到我試驗了爲ViewGroups定義的android:descendantFocusability設置。在將它設置爲ViewGroup.FOCUS_AFTER_DESCENDANTS後,它的行爲變得更加可預測,至少對我而言。

+0

關於xml,頂視圖組編寫android:descendantFocusability =「blocksDescendants」的作品魅力十足 – Beyaz

1

好的。這是你的代碼。希望它滿足您的需求,或者至少這就是我從您的文章得到了:)


import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.text.InputFilter; 
import android.text.Spanned; 
import android.util.Log; 
import android.view.*; 
import android.widget.*; 
import java.util.ArrayList; 
import java.util.List; 

public class EditListActivity extends Activity { 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LinearLayout ll = new LinearLayout(this); 
     LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.WRAP_CONTENT, 
       LinearLayout.LayoutParams.WRAP_CONTENT); 
     ll.setLayoutParams(lp1); 
     ll.setOrientation(1); 
     ListView lv = new ListView(this); 
     MyListAdapter adapter = new MyListAdapter(this, null); 
     lv.setAdapter(adapter); 
     ll.addView(lv); 
     setContentView(ll); 

    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
    } 


    class MyListAdapter extends BaseAdapter implements View.OnLongClickListener, View.OnFocusChangeListener { 
     private final String TAG = ListActivity.class.getName(); 
     List<String> stringsarray; 
     private Context context; 

     public MyListAdapter(Context context, List<String> phonebook) { 
      this.stringsarray = new ArrayList<String>(); 

      this.stringsarray.add("test1"); 
      this.stringsarray.add("test2"); 
      this.stringsarray.add("test3"); 
      Log.d(TAG, "created list adapter"); 
      this.setContext(context); 
     } 

     public int getCount() { 
      return this.stringsarray.size(); 
     } 

     public String getItem(int position) { 
      return this.stringsarray.get(position); 
     } 

     public long getItemId(int position) { 
      return position; 
     } 


     public View getView(final int position, View convertView, ViewGroup parent) { 
      LinearLayout rl = new LinearLayout(getContext()); 

      rl.setOrientation(1); 
      EditText text = new EditText(getContext()); 

      text.setOnLongClickListener(this); 
      text.setOnFocusChangeListener(this); 
      text.setText(this.stringsarray.get(position)); 

      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.FILL_PARENT, 
        LinearLayout.LayoutParams.WRAP_CONTENT); 

      text.setFocusable(true); 
      rl.addView(text, lp); 
      return rl; 
     } 

     public void onFocusChange(View view, boolean b) { 
      EditText et = (EditText) view; 
       et.setFilters(new InputFilter[]{ 
         new InputFilter() { 
          public CharSequence filter(CharSequence src, int start, 
                 int end, Spanned dst, int dstart, int dend) { 
           return src.length() < 1 ? dst.subSequence(dstart, dend) : ""; 
          } 
         } 
       }); 
      if (b) { 
       Log.d(TAG, "hasFocus true called " + et.getText()); 
       et.setText("focused"); 
       et.setSelection(et.length()); 

      } else { 

       Log.d(TAG, "hasFocus false called " + et.getText()); 
       et.setText("unfocused"); 
       //TODO Save to DB 
      } 
     } 

     public boolean onLongClick(View view) { 
      getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
      final EditText et = (EditText) view; 
      et.setFilters(new InputFilter[]{ 
         new InputFilter() { 
          public CharSequence filter(CharSequence src, int start, 
                 int end, Spanned dst, int dstart, int dend) { 
           return src; 
          } 
         } 
       }); 
      et.setText("editable"); 
      Log.d(TAG, "on long click called " + et.getText()); 
      et.requestFocus(); 
      et.setFocusableInTouchMode(true); 

      return true; 
     } 

     public Context getContext() { 
      return context; 
     } 

     public void setContext(Context context) { 
      this.context = context; 
     } 
    } 

} 

樂趣。

+0

對不起,你必須走那麼遠,但這不是我要找的。這只是一個可編輯的edittexts列表,可以使用簡單的點擊進行旋轉。我想要一個edittext的列表視圖,只有在你長時間點擊其中的一個之後才能編輯。 –

+0

這正是它所做的。你有沒有試過編譯和測試它? –

+0

我已經更新了代碼,以組成正確的編輯和顯示軟鍵盤的禁用功能。現在應該沒問題。測試我的手機與2.3.2上的2.2.2 +模擬器 –