我得到了这个应用程序(顺便说一句,它做得很好),我需要在其中动态地将一个 LinearLayout 视图添加到一个 LinearLayout 容器。它的工作方式是用户在 EditText 中写一些东西并按下键盘上的“返回”键。当检测到返回键事件时,一个带有另一个 EditText 视图的 LinearLayout 会直接添加到用户刚刚编辑的视图之下,并且焦点会切换到刚刚添加的 LineaLayout 内的 EditText 视图。这将创建一个带有 EditText 视图的 LinearLayouts 垂直列表(请参阅下面的视频以获取说明)。这在我拥有的两个测试设备以及我的小型 alpha 测试组的五个不同设备上都可以正常工作,我似乎无法在模拟器中重新创建错误。但是,在我老板的设备上进行测试时(他在另一个国家,所以我可以'
这是该错误的视频。预期的行为是插入另一个带有两个 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>
这是非常令人沮丧的,因为只要我无法重新创建它,我就无法解决这个错误。如前所述,我可以访问的所有设备都没有这种行为,我也无法让模拟器这样做。
显示该错误的两个设备:
- 索尼爱立信 Xperia PLAY (Android 2.3.3)
- 三星 Nexus S (Android 4.1.2)
应用程序按预期工作的设备:
- HTC One S (Android 4.1.1)
- 三星 I9000 Galaxy S (Android 2.3.5)
- 三星 I9100 Galaxy S II (Android 2.3.4)
- HTC One X (Android 4.0)
- Google Nexus 4(我认为是 Android 4.2)
- AVD 设置为显示错误的两个设备
我正在寻找一些建议以找出导致此错误的原因,或者只是一些有关重新创建错误的建议。谢谢你。