2

私の質問は、の代わりに LinearLayout を( )Objectの「結果」として使用すると、Eclipse で「タイプ LinearLayout をインスタンス化できません」のような多くのエラーが表示されるのはなぜですか? もう 認識していないようで、その理由がわかりません。宣言には黄色の下線があり、Eclipse は次 のように述べています。型パラメーター LinearLayout は型 LinearLayout を隠しています。 誰かが私にこれを説明できますか?AsyncTaskTableWithinExpListTask<Params, Progress, LinearLayout>
LinearLayoutcreateFormattedCell()
AsyncTaskLinearLayout

クラスのコードは次のとおりです。

import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class TableWithinExpListTask<Params, Progress, LinearLayout> extends AsyncTask<Params, Progress, LinearLayout> {

    private final int TABLE_BORDER = 1;
    private final int TABLE_TEXT_PADDING = 10;


    private Context context = null;
    private String str = null;
    private boolean tableHeader = false;
    private LinearLayout column = null;

    public TableWithinExpListTask(Context context, String str, boolean tableHeader, LinearLayout column) {
        this.context = context;
        this.str = str;
        this.tableHeader = tableHeader;
        this.column = column;
    }

    @Override
    protected LinearLayout doInBackground(Params... arg0) {
        return this.createFormattedCell(this.tableHeader, this.str);
    }

    @Override
    protected void onPostExecute(LinearLayout result) {
        this.column.addView(result);
    }

    private LinearLayout createFormattedCell(boolean tabHeader, String str) {
        // Layout che circonda le textView necessario per disegnare il bordo
        // delle celle
        LinearLayout container = new LinearLayout(this.context);

        container.setPadding(TABLE_BORDER, TABLE_BORDER, 0, 0);
        container.setBackgroundColor(Color.BLACK);

        TextView textView = new TextView(this.context);

        textView.setPadding(TABLE_TEXT_PADDING, TABLE_TEXT_PADDING, TABLE_TEXT_PADDING, TABLE_TEXT_PADDING);
        textView.setBackgroundColor(Color.WHITE);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
        textView.setLayoutParams(params);

        if (tabHeader) {
            textView.setTypeface(Typeface.DEFAULT_BOLD);
            textView.setBackgroundColor(this.context.getResources().getColor(R.color.light_grayish_orange));
        }
        textView.setText(str);
        container.addView(textView);

        return container;
    }


}

これについて他の質問がありますが、この場合の動作を完全には理解していません。

4

2 に答える 2

5

クラスの名前に一般的なパラメーター (山括弧内のもの) を付けることは、クラスのユーザーが関連する型を指定できるようにすることを Java に伝え、それらの名前を「変数名」として使用しています。それらのユーザーが選択するタイプ。たとえば、 を参照してください。Map<K,V>ここで、Kとはのキーと値のVタイプを表します。Map型パラメーターとしてリストLinearLayoutした場合、コンパイラーは、ユーザーが選択する他のクラスのプレースホルダーとしてそれを使用しているだけであると考え、それを構築する方法を知りませんでした。

具体的なクラスでジェネリックを使用するクラスを拡張する必要がありますが、そこに入力する特定の型がわかっているため、使用しているクラスだけに型パラメーターを配置しないでください。 . たとえば、s をs にMapマップするだけのカスタム クラスを作成している場合は、 .StringIntegerpublic class MyMap implements Map<String, Integer>

于 2013-08-08T08:47:53.613 に答える
2

コード全体を次のように変更します。

import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

public class TableWithinExpListTask extends
        AsyncTask<Void, Void, LinearLayout> {

    private final int TABLE_BORDER = 1;
    private final int TABLE_TEXT_PADDING = 10;

    private Context context = null;
    private String str = null;
    private boolean tableHeader = false;
    private LinearLayout column = null;

    public TableWithinExpListTask(Context context, String str,
            boolean tableHeader, LinearLayout column) {
        this.context = context;
        this.str = str;
        this.tableHeader = tableHeader;
        this.column = column;
    }

    @Override
    protected LinearLayout doInBackground(Void... arg0) {
        return this.createFormattedCell(this.tableHeader, this.str);
    }

    @Override
    protected void onPostExecute(LinearLayout result) {
        this.column.addView(result);
    }

    private LinearLayout createFormattedCell(boolean tabHeader, String str) {
        // Layout che circonda le textView necessario per disegnare il bordo
        // delle celle
        LinearLayout container = new LinearLayout(this.context);

        container.setPadding(TABLE_BORDER, TABLE_BORDER, 0, 0);
        container.setBackgroundColor(Color.BLACK);

        TextView textView = new TextView(this.context);

        textView.setPadding(TABLE_TEXT_PADDING, TABLE_TEXT_PADDING,
                TABLE_TEXT_PADDING, TABLE_TEXT_PADDING);
        textView.setBackgroundColor(Color.WHITE);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
        textView.setLayoutParams(params);

        if (tabHeader) {
            textView.setTypeface(Typeface.DEFAULT_BOLD);
            textView.setBackgroundColor(this.context.getResources().getColor(
                    R.color.light_grayish_orange));
        }
        textView.setText(str);
        container.addView(textView);

        return container;
    }

}

また、Javaジェネリックについても少し勉強する必要があると思います。これについては、 Oracleチュートリアルを読み始めます。

于 2013-08-08T08:40:07.517 に答える