2

動的なカスタムテーブル行を使用してテーブルを作成しています。アクティビティクラスでIDを取得する必要があります。

main_Activity-> MyTableLayoutView-> MyTableRow

私の質問は、テーブル(TextViews)でクリックされたセルのIDをmain_Activiyに取得するにはどうすればよいですか。

MyTableRowView:

    public void addRow(String[] data, int[] rowId) {
    for (int i = 0; i < data.length; i++) {
        TextView tv = parseTextView(data[i]);
        tv.setId(rowId[i]);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView tv2 = (TextView) v;
                clickedText = tv2.getText().toString();
                Debug.debugMsg(clickedText + " " + tv2.getId());
            }
        });
        this.addView(tv);
    }
}

私が得ることができる限り、TablerowViewクラスからIDを取得していますが、Activityクラスにある必要があります。誰かが私を教えてくれるならお願いします。前もって感謝します。

アクティビティクラス:

    private void showTables() {
    db.open();
    db.importDb();// TODO
    table = new TableLayoutView(this,Converter.toArrayListStringArray(db.getDbTablesForChoose()));
    table.addDataListArray(Converter.toArrayListStringArray(db.getDbTablesForChoose()),true);
    llChooseSQLTable.addView(table);
}

TableLayoutView:

    public void addDataListArray(ArrayList<String[]> data, boolean header) {

    for (int i = 0; i < ROW_NUMBERS; i++) {
        TableRowView tableRow = new TableRowView(context);

        tableRow.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        tableRow.addRow(data.get(i),idHandler.getNextIdsRow());//idHandles passes unique id.
        this.addView(tableRow); 
    }
}
4

2 に答える 2

1

上記のコードからIDを取得できるようです。主な関心事がそのIDをビューから親クラスに伝播することである場合は、複数の方法でそれを行うことができます。1つの方法は、ビューのコンテキストを取得し、それを特定のアクティビティにキャストして、そのアクティビティ内で、たとえばonClick()操作内で関数を呼び出すことです。

public void onClick(View v) {
  ((MyActivity)v.getContext()).insertNotificationMethod(v.getId());
}

アクティビティがMyActivityと呼ばれ、整数を取るinsertNotificationmethodと呼ばれるメソッドを実装する場合。これは、このビューが常にこの関数内にある場合にのみ機能し、それでもそれを行うにはかなり大雑把な方法です。

次を使用して、onClick()メソッド内で直接呼び出すこともできます。

MyActivity.this.insertNotificationMethod(v.getId());

ただし、この方法では、このビューがこの特定のアクティビティ内でのみ役立つように制限されます。

For a more generic way, you could BroadcastReceivers which may be a little more complicated that you would like. For more information about those you could check out the Android documentation here: http://developer.android.com/reference/android/content/BroadcastReceiver.html

Hopefully that helps.

于 2012-08-30T22:18:46.003 に答える
0

The only solution that I can think of is to move your addRow() and addDataListArray() methods to the Activity with some modefication:

public void addRow(String[] data, int[] rowId, TableRowView tableRow) {
for (int i = 0; i < data.length; i++) {
    TextView tv = parseTextView(data[i]);
    tv.setId(rowId[i]);
    tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            TextView tv2 = (TextView) v;
            clickedText = tv2.getText().toString();
            clickedId = tv2.getId());
        }
    });
    tableRow.addView(tv);
}
}

public void addDataListArray(ArrayList<String[]> data, boolean header, TableLayoutView table) {

for (int i = 0; i < ROW_NUMBERS; i++) {
    TableRowView tableRow = new TableRowView(context);

    tableRow.setLayoutParams(new LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    addRow(data.get(i),idHandler.getNextIdsRow(), tableRow);//idHandles passes unique id.
    table.addView(tableRow); 
}
}

And in your Activity change this line:

//table.addDataListArray(Converter.toArrayListStringArray(db.getDbTablesForChoose()),true);
addDataListArray(Converter.toArrayListStringArray(db.getDbTablesForChoose()),true, table);

Although I don't know if other part of your app will be affected by this huge modification I made.

Good luck!

于 2012-08-30T22:25:15.767 に答える