0

このコードは、配列で定義された方法でビューとTextViewで構成されるレイアウトをプログラムで生成します。ただし、各TextViewをクリック可能にして、そのTextViewのより大きな説明のトーストを表示しようとしています。トーストは特定のTextViewに固有である必要があるため、位置iで別の説明の配列を使用してTextViewを設定しようとしています。ただし、これを実行しようとすると、「別のメソッドで定義された内部クラス内の非最終変数を参照できません」というエラーが発生します。

だから私は疑問に思っています、どうすればこれを回避できますか?iループの反復ごとに変化するため、最終的なものにすることはできませんか?

for ( int i = 0; i < formulae.length; i++){
            if (formulae[i].equals("horizontalrule")){

                View rule = new View(FormulaeActivity.this);
                rule.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 2));
                rule.setBackgroundColor(0xFF000000);

                View spacerbig = new View(FormulaeActivity.this);
                spacerbig.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 20));
                spacerbig.setBackgroundResource(android.R.color.transparent);

                container.addView(rule);
                container.addView(spacerbig);
            }

        else{
            View spacersmall1 = new View(FormulaeActivity.this);
            spacersmall1.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 5));
            spacersmall1.setBackgroundResource(android.R.color.transparent);

            tx[i] = new TextView(FormulaeActivity.this);
            tx[i].setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 50));
            tx[i].setText(Html.fromHtml(formulae[i]));
            tx[i].setTextSize(20);
            tx[i].setPadding(10, 0, 0, 0);




            tx[1].setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Toast.makeText(getApplicationContext(),   Html.fromHtml(explanations[i]), Toast.LENGTH_SHORT).show();
// ^this is the offending line


                }
            });


            container.addView(tx[i]);   
            container.addView(spacersmall1);
        }
4

2 に答える 2

2

i各反復での値を保持する最終変数を用意してみませんか。

for ( int i = 0; i < formulae.length; i++){
    final int pos = i;

そして、このようにそれを使用してくださいonClick()

Toast.makeText(getApplicationContext(),   Html.fromHtml(explanations[pos])..
于 2013-03-27T08:34:14.540 に答える
0

これを試して、

for ( int i = 0; i < formulae.length; i++){
            if (formulae[i].equals("horizontalrule")){

                View rule = new View(FormulaeActivity.this);
                rule.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 2));
                rule.setBackgroundColor(0xFF000000);

                View spacerbig = new View(FormulaeActivity.this);
                spacerbig.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 20));
                spacerbig.setBackgroundResource(android.R.color.transparent);

                container.addView(rule);
                container.addView(spacerbig);
            }

        else{
            View spacersmall1 = new View(FormulaeActivity.this);
            spacersmall1.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 5));
            spacersmall1.setBackgroundResource(android.R.color.transparent);

            tx[i] = new TextView(FormulaeActivity.this);
            tx[i].setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 50));
            tx[i].setText(Html.fromHtml(formulae[i]));
            tx[i].setTextSize(20);
            tx[i].setPadding(10, 0, 0, 0);
            container.addView(tx[i]);   
            container.addView(spacersmall1);
        }
}


for(int i=0;i<tx.length;i++)
{
if(tx[i]!=null)
{
       tx[i].setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Toast.makeText(getApplicationContext(),Html.fromHtml(explanations[i]), Toast.LENGTH_SHORT).show();
// ^this is the offending line
                }
            });
        }
}
于 2013-03-27T08:38:20.890 に答える