0

RelativeLayout に手動で作成した TextView 配列があります。onclicklistener が機能しないことを除いて、すべてが完璧に表示されます コード:

private RelativeLayout mRLMain;
private TextView [] mTV;
private OnClickListener  mTextOnClickListener;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mRLMain = (RelativeLayout) findViewById(R.id.rlMainGame);
    mTV = new TextView[20];

    mSqueareLayout = new RelativeLayout.LayoutParams(mSquareWidth,mSquareWidth);

    for (i = 0; i < 20; i++) {
        mTV [i] = new TextView(MainActivity.this);
        mTV [i].setBackgroundColor(Color.RED);
        mTV [i].setTextColor(Color.WHITE);
        mTV [i].setX(i+100);
        mTV [i].setId(i);

        mTV [i].setOnClickListener(mTextOnClickListener);

        mRLMain.addView(mTV [i], mSqueareLayout);
    }

    mTextOnClickListener = new OnClickListener() {
        @Override
        public void onClick(View view) { Log.d("XXX","CLICK"); }
    };
}

試してみてください

mTV [i].setFocusable(false);
mTV [i].setFocusableInTouchMode(false);
mTV [i].setClickable(true);
mTV [i].setDuplicateParentStateEnabled(false);

そして何もありません: - エラーなし - ログなし

4

2 に答える 2

2

clickListener刺す前に初期化します。したがって、注文を変更すると問題を解決できます。

for (i = 0; i < 20; i++) {
    mTV [i] = new TextView(MainActivity.this);
    mTV [i].setBackgroundColor(Color.RED);
    mTV [i].setTextColor(Color.WHITE);
    mTV [i].setX(i+100);
    mTV [i].setId(i);

    // Set clickListener
    mTV [i].setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d("XXX","CLICK");
            Toast.makeText(MainActivity.this, "Position "+ i, Toast.LENGTH_LONG).show();
        });

    mRLMain.addView(mTV [i], mSqueareLayout);
}
于 2016-11-30T18:18:51.887 に答える
0

ClickListenerに複雑なロジックが含まれる場合は、別のクラス (内部クラスなど) に抽出することをお勧めします。

// same top part
for (int i = 0; i < 20; i++){
            mTV [i] = new TextView(MainActivity.this);
            mTV [i].setBackgroundColor(Color.RED);
            mTV [i].setTextColor(Color.WHITE);
            mTV [i].setX(i+100);
            mTV [i].setId(i);

            // main change here
            mTV [i].setOnClickListener(new CustomClickListener(i));

            mRLMain.addView(mTV [i], mSqueareLayout);
        }
    }

static class CustomClickListener implements View.OnClickListener {

    private int viewId;

    // another option is to pass a reference to a view here
    // private View view;
    // in this case, you should create appropriate constructor

    public CustomClickListener(int viewId) {
        this.viewId = viewId;
    }

    @Override
    public void onClick(View view) {
        Log.d("XXX","Click on view " + viewId);
        // some logic on this view
    }
}
于 2016-11-30T18:48:32.957 に答える