0

次のようなコードがあります。

 final int height = 0; //I want to get this height after Predraw view
 view.addOnPreDrawListener(new OnPreDrawListener()
    {

        @Override
        public boolean onPreDraw()
        {
            int myHeight = itemLayout.getMeasuredHeight();
            height = myHeight; //this line has error
            return false;
        }
    });

問題は、リスナーから値 (特にプリミティブ型) を取得する方法です。それは常に示しています

 Cannot refer to a non-final variable height inside an inner class defined in a different method 

次に、変数を final に変更しようとすると、エラーが表示されます。

 The final local variable height cannot be assigned, since it is defined in an enclosing type

API が使いにくい理由がわかりません。

4

6 に答える 6

3

前にグローバル として宣言するint myHeight;onCreate(....)

于 2012-05-15T09:12:24.947 に答える
2

これに対処する最も簡単な方法は、Activity実装を許可することOnPreDrawListenerです。

public class MyActivity extends Activity implements OnPreDrawListener{
  int height;

  method(){
    ..
    view.addOnPreDrawListener(this);
    ..
  }

  @Override
  public boolean onPreDraw(){
    height = itemLayout.getMeasuredHeight();
  }  
}

問題は、API の「複雑さ」ではありません。これは、関連するさまざまな変数の寿命に関する実際の Java の問題です。変数heightfinal を宣言しないと、内部の匿名クラスがアクセスしようとするまでに、スタックから消去される可能性があります。印をつけることfinalで、 の寿命を保証せざるを得なくなりますheight

私が提案したことを行うことで、Activity オブジェクトとリスナー オブジェクトの寿命を同じにしています。

于 2012-05-15T09:24:43.067 に答える
2

高さの初期化で「最終」を使用して、後で変更しようとすることはできません。ただし、変数を関数内ではなくクラスに割り当てることもできます。

private int tmpHeight = 0;

これにより、リスナー内から変数にアクセスできるようになります。

于 2012-05-15T09:14:18.190 に答える
2

あなたが言及した両方のエラーは正しいです

1) 非最終変数は内部クラス内でアクセスできません

2) final 変数は初期化後に変更できません

高さをクラス内のグローバル変数として宣言し、どのメソッドでも宣言しないと、問題が解決します

 int myHeight; 
于 2012-05-15T09:15:03.400 に答える
1

クラスレベルの変数にすることもオプションです。

于 2012-05-15T09:12:38.887 に答える
1

エラーはリスナーではなくheight、最終変数としての宣言にあります。

つまり、初期化後に変更することはできません。最終的なものを削除する必要があります。

int height = 0; 
view.addOnPreDrawListener(new OnPreDrawListener() {

    @Override
    public boolean onPreDraw() {
        int myHeight = itemLayout.getMeasuredHeight();
        height = myHeight; 
        return false;
    }
});
于 2012-05-15T09:12:39.317 に答える