0

フラグメントを使用して Android 3.1 タブレット アプリケーションを開発しています。

同時に 2 つのフラグメントしかメモリ上にないことがわかりました。3 番目のものを表示すると、最初のものは を呼び出しますonDestroyView

EditTextプログラムでフラグメントのビューに追加します。メソッドでフラグメントのビューを再作成した後、それらEditTextは再び表示されませんonResume

これらを使用EditTextして、ユーザーがフォームにデータを追加できるようにし、参照を に保存しますfirstTable HashMap。それを使用してHashMap、ユーザーの値を取得します。

ここでは、EditTextプログラムでそれらを作成します。

private LinearLayout createNewFirstTableRow(long articleId)
{
    LinearLayout layout = new LinearLayout(mActivity);
    LayoutParams parentParams = new LayoutParams(LayoutParams.MATCH_PARENT, 40);
    parentParams.weight = 1;
    layout.setLayoutParams(parentParams);

    if (firstTable == null)
        firstTable = new HashMap<Long, ArrayList<EditText>>();

    ArrayList<EditText> fields = new ArrayList<EditText>(7);

    LayoutParams params = new LayoutParams(0, 40);
    params.weight = 0.125f;

    TextView textView = new TextView(mActivity);
    textView.setLayoutParams(params);
    textView.setText(new Long(articleId).toString());
    layout.addView(textView);

    for (int i = 0; i < 7; i++)
    {
        EditText edit = new EditText(mActivity);
        edit.setLayoutParams(params);
        edit.setInputType(InputType.TYPE_CLASS_NUMBER);
        fields.add(i, edit);
        layout.addView(edit);
    }

    firstTable.put(new Long(articleId), fields);

    return layout;
}

firstTablevariable はグローバル変数です: private HashMap<Long, ArrayList<EditText>> firstTable;.

私を追加するEditTextには、 で次のことを行いますonResume

@Override
public void onResume()
{
    Log.v("QuantityFragment", "onResume: " + firstTableRowIndex);

    if ((firstTable != null) && (secondTable != null))
    {
        firstTableRowIndex = FIRST_TABLE_ROW_INDEX;
        secondTableRowIndex = SECOND_TABLE_ROW_INDEX;

        LinearLayout table = (LinearLayout)view.findViewById(R.id.quantityTable);

        for (int index = 0; index < firstTable.size(); index++)
        {
            Long articleId = articleIds.get(index);

            table.addView(resumeTable(articleId, secondTable.get(articleId)), secondTableRowIndex);
            table.addView(resumeTable(articleId, firstTable.get(articleId)), firstTableRowIndex);

            firstTableRowIndex++;
            secondTableRowIndex++;
        }
    }

    super.onResume();
}

private LinearLayout resumeTable(Long articleId, ArrayList<EditText> fields)
{
    LinearLayout layout = new LinearLayout(mActivity);
    LayoutParams parentParams = new LayoutParams(LayoutParams.MATCH_PARENT, 40);
    parentParams.weight = 1;
    layout.setLayoutParams(parentParams);


    LayoutParams params = new LayoutParams(0, 40);
    params.weight = 0.125f;

    TextView textView = new TextView(mActivity);
    textView.setLayoutParams(params);
    textView.setText(new Long(articleId).toString());
    layout.addView(textView);

    for (int index = 0; index < fields.size(); index++)
    {
        layout.addView(fields.get(index));
    }

    return layout;
}

しかし、ここでlayout.addView(textView);例外があります。

IllegalStateException: 指定された子には既に親があります。最初に子の親で removeView() を呼び出す必要があります。

それらを再度追加する別の方法はありEditTextますか?

アップデート:

変更する問題を解決しましたresumeTable

private LinearLayout resumeTable(Long articleId, ArrayList<EditText> fields)
{
    LinearLayout layout = new LinearLayout(mActivity);
    LayoutParams parentParams = new LayoutParams(LayoutParams.MATCH_PARENT, 40);
    parentParams.weight = 1;
    layout.setLayoutParams(parentParams);


    LayoutParams params = new LayoutParams(0, 40);
    params.weight = 0.125f;

    TextView textView = new TextView(mActivity);
    textView.setLayoutParams(params);
    textView.setText(new Long(articleId).toString());
    layout.addView(textView);

    for (int index = 0; index < fields.size(); index++)
    {
        LinearLayout parent = (LinearLayout)fields.get(index).getParent();
        parent.removeView(fields.get(index));
        layout.addView(fields.get(index));
    }

    return layout;
}

これは重要な部分です:

    for (int index = 0; index < fields.size(); index++)
    {
        LinearLayout parent = (LinearLayout)fields.get(index).getParent();
        parent.removeView(fields.get(index));
        layout.addView(fields.get(index));
    }

質問は開いています。より良い解決策がある場合は、お知らせください。

4

2 に答える 2

2

Viewsレイアウトに追加された( ) への参照を保存し、後でそれらを新しく構築された親にEditText再度追加するため、その例外がスローされます。Views

解決策については、なぜそれらへの参照を保存することにしたのかわかりませんEditTexts。それらから保存する価値があると思われる唯一のデータEditTextsは、ユーザーが入力したテキストです。その場合、その特定のテキストの代わりにそのテキストを保存する必要があります.あなたのEditText方法は次のようになります:

//...
if (firstTable == null) {
    // your HashMap now stores text instead of an EditText
    firstTable = new HashMap<Long, ArrayList<String>>();// store only the text from the EditText
}

    ArrayList<String> fields = new ArrayList<String>(7);
    LayoutParams params = new LayoutParams(0, 40);
    params.weight = 0.125f;

    TextView textView = new TextView(mActivity);
    textView.setLayoutParams(params);
    textView.setText(new Long(articleId).toString());
    layout.addView(textView);

    for (int i = 0; i < 7; i++) {
        EditText edit = new EditText(mActivity);
        edit.setLayoutParams(params);
        edit.setInputType(InputType.TYPE_CLASS_NUMBER);
        fields.add(i, ""); // the EditText are empty at first
        layout.addView(edit);
    }
    firstTable.put(new Long(articleId), fields);

次に、いつ復元するのですかEditTexts

private LinearLayout resumeTable(Long articleId, ArrayList<String> fields) {
    LinearLayout layout = new LinearLayout(mActivity);
    LayoutParams parentParams = new LayoutParams(LayoutParams.MATCH_PARENT, 40);
    parentParams.weight = 1;
    layout.setLayoutParams(parentParams);
    LayoutParams params = new LayoutParams(0, 40);
    params.weight = 0.125f;
    TextView textView = new TextView(mActivity);
    textView.setLayoutParams(params);
    textView.setText(new Long(articleId).toString());
    layout.addView(textView);
    for (int index = 0; index < fields.size(); index++) {
        // create new EditTexts
        EditText edit = new EditText(mActivity);
        edit.setLayoutParams(params);
        edit.setInputType(InputType.TYPE_CLASS_NUMBER);
        edit.setText(fields.get(index)); // get the text coresponding to this particular EditText
        layout.addView(edit);
    }
    return layout;
}

もちろん、ユーザーが に何かを入力したら、それを変数の正しい位置にEditTexts格納する必要があります。firstTable

于 2012-06-26T10:19:28.003 に答える
0

問題はフィールドの要素を2回追加したことによるものだと思います

 ArrayList<EditText> fields = new ArrayList<EditText>(7);

1 - createNewFirstTableRow で

for (int i = 0; i < 7; i++)
    {
        EditText edit = new EditText(mActivity);
        edit.setLayoutParams(params);
        edit.setInputType(InputType.TYPE_CLASS_NUMBER);
        fields.add(i, edit);//<-----------
        layout.addView(edit);//<----------- added in layout 
    }

2- onResume()->resumeTable

for (int index = 0; index < fields.size(); index++)
    {
        layout.addView(fields.get(index));//<----------------
    }

fields 要素が画面に既に追加されている場合、それを 2 回追加することはできません.......

于 2012-06-26T10:01:30.860 に答える