2013-08-21 118 views
1

的奇怪的錯誤,我得到這個應用程序(也就是不如順便說一句做),我需要一個的LinearLayout視圖動態地添加到的LinearLayout容器。它的工作方式是用戶在EditText中寫入內容並按下鍵盤上的「返回」鍵。當檢測到返回鍵事件時,帶有另一個EditText視圖的LinearLayout直接添加到用戶剛編輯的視圖下,焦點切換到剛添加的LineaLayout內的EditText視圖。這將在裏面創建一個帶有EditText視圖的LinearLayouts垂直列表(請參閱下面的視頻以獲取插圖)。它在我的兩個測試設備上以及我的小型alpha測試組的五個不同設備上運行良好,我似乎無法在模擬器中重新創建該錯誤。然而,當測試我老闆的設備時(他在另一個國家,所以我不能向他展示我的設備),新的EditText視圖從不會出現,並且寫在當前EditText視圖中的文本以非常錯誤的方式消失見下面的視頻)。涉及動態添加的LinearLayout視圖的LinearLayout容器

Here是一個bug的視頻。預期的行爲是插入另一個帶有兩個EditText視圖的LinearLayout(並顯示'2'而不是'1'),但是您可以看到一個新的LinearLayout沒有出現,並且文本從當前EditText中被刪除視圖。如果需要,我還可以錄製預期行爲的視頻。

的代碼看起來是這樣的:

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    //Create a listener for the item fields 
    TextView.OnEditorActionListener itemListener = new OnItemEditorListener(); 
    nextItem.setOnEditorActionListener(itemListener); 
    nextItem.addTextChangedListener(new ListTextWatcher()); 
} 

private LinearLayout addLine(int i, String text){ 
    LinearLayout line = createline(R.layout.list_item_add); 
    EditText listTextView = (EditText) line.getChildAt(1); 
    if(!text.equals("")) 
     listTextView.setText(text); 
    itemContainer.addView(line); 
    int index = i + 1; 
    ((EditText) line.getChildAt(0)).setText(index + "."); 
    listTextView.setOnEditorActionListener(new OnItemEditorListener()); 
    listTextView.addTextChangedListener(new ListTextWatcher()); 
    return line; 
} 

private class OnItemEditorListener implements TextView.OnEditorActionListener { 
    @Override 
    public boolean onEditorAction(TextView view, int actionId, KeyEvent event) { 
     //Check if the current action is a keyDown event on the return button of the keyboard 
     if(actionId == EditorInfo.TYPE_NULL && event.getAction() == KeyEvent.ACTION_DOWN){ 
      final EditText currentView = (EditText) view; 
      //if there is no text in the current field, do nothing 
      if(currentView.getText().toString().equals("")) 
       return true; 
      int childCount = itemContainer.getChildCount(); 
      LinearLayout newLine = null; 
      //iterate through all existing item lines 
      for(int i = 0; i < childCount; i++){ 
       LinearLayout currentLine = (LinearLayout) itemContainer.getChildAt(i); 
       //Check if the current iteration is looking at the line that had focus when return was pressed 
       if(currentView.equals(currentLine.getChildAt(1))){ 
        //check if the current line is the last item, and if so add a new line 
        if(i == childCount - 1) 
         newLine = addLine(i + 1, ""); 
        //if current line is not the last line, give focus to the next line 
        else 
         newLine = (LinearLayout) itemContainer.getChildAt(i + 1); 
        break; 
       } 
      } 
      nextItem = (EditText) newLine.getChildAt(1); 
      nextItem.requestFocus(); 
     } 
     return true; 
    } 
} 

這裏是被添加的LinearLayout:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/item_container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="5dp" 
    android:layout_marginRight="5dp" 
    android:orientation="horizontal" 
    android:weightSum="1" > 

<EditText 
    android:id="@+id/item_index" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="50dp" 
    android:layout_weight="0.15" 
    android:background="@drawable/round_corners_left_white_background" 
    android:enabled="false" 
    android:gravity="center" 
    android:inputType="none" 
    android:text="@string/one_dot" 
    android:textColor="@color/ts1" 
    android:textSize="18sp" 
    android:textStyle="bold" /> 

<EditText 
    android:id="@+id/list_item" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="10dp" 
    android:layout_weight="0.85" 
    android:background="@drawable/round_corners_right_white_background" 
    android:hint="@string/new_item" 
    android:lines="1" /> 
</LinearLayout> 

這是非常令人沮喪,因爲我不能給這個錯誤什麼,只要我無法重新創建它。正如前面提到的,我所訪問的設備都沒有這樣的行爲,我也無法讓模擬器做到這一點。

所表示的錯誤這兩個設備:

  1. 索尼愛立信Xperia PLAY(2.3.3的Android)
  2. 三星Nexus S(的Android 4.1.2)

設備,其中應用程序正在按預期工作:

  1. HTC One S(Android 4.1.1)
  2. 三星I9000 Galaxy S的(安卓2.3.5)
  3. 三星I9100 GALAXY S II(安卓2.3.4)
  4. 的HTC One X(Android 4.0版本)
  5. 谷歌Nexus 4(的Android 4.2,我認爲)
  6. 自動真空澱積系統設置爲兩個設備顯示我正在尋找一些建議,以找到是什麼原因造成這個錯誤,或只是一些建議,以重現錯誤的bug

。謝謝。

回答

1

那麼通過視頻判斷問題可能發生在這條線上,在這些設備上返回false。

if(actionId == EditorInfo.TYPE_NULL && event.getAction() == KeyEvent.ACTION_DOWN){ 

嘗試這樣做

if(event.getAction() == KeyEvent.ACTION_DOWN){ 

或者這

if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER){ 

我的理論是,這些設備處理鍵盤事件的不同不知?

+1

感謝您的反饋。您可能是對的(現在上傳更改以進行測試)。我從未想到'文本消失'只是在EditText視圖中創建新行的返回鍵,我認爲這是一種奇怪的錯誤。 – AHaahr

+0

該死的,沒有工作。確信就是這樣。不過,我認爲你是對的,問題是正確地捕捉關鍵事件。 – AHaahr

相關問題