2016-12-28 8 views
0

編集:私はプログラムでImageViewを入れることができるように、ビューの高さ/幅を取得しようとしています。しかしgetHeight()getWidth()は0を返すので、私はImageViewを正しい位置に置くことができませんでした。私はImageViewRelativeViewmain_activity)に表示させました。Android RelativeLayout.getHeightは0を返します。研究は終了しましたが、一般的な解決策は私にエラーを与えています

私は0エラーを返すgetHeight()関連答えを知ってる:How to retrieve the dimensions of a view?
は、残念ながらそれは私がNULLポインタ参照でメソッドを呼び出すためにしようとしていると言って、ld.setLayerInset()との行に私の例外を与えています。私はそのような例外の意味を理解していますが、変数名の修正を加えたコードに上記リンクのコードをコピーして貼り付けようとしていたので、私のコードに何が問題なのか分かりません。ここに私のコードの一部を以下のとおりです。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    findViewById(R.id.activity_main).getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      LayerDrawable ld = (LayerDrawable) findViewById(R.id.activity_main).getBackground(); 
      ld.setLayerInset(1,0,0,0,0); 
      if (Build.VERSION.SDK_INT >= 16) { 
       findViewById(R.id.activity_main).getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } else { 
       findViewById(R.id.activity_main).getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 
     } 
    }); 
... 
} 

私はこの問題は、getBackground()は、例外をスローするように次の行を引き起こすnullを得る上で発生したと思うが、私はすべての問題だか分かりません。

+0

おそらく、どんな 'findViewById(R.id.activity_main)'を返すには背景がありません。 – CommonsWare

+0

RelativeLayoutの背景がありませんか?現在のところ、まだ背景はありませんが、それが本当に問題であれば、それは非常に奇妙です。また、そのリンクの回答提供者はOPを知っていたのでしょうか、それとも他の人が自分の意見についてのバックグラウンドを持っていなければなりませんか? –

+0

"それが本当に問題ならば、それは非常に奇妙なことでしょう。" - なぜ?バックグラウンドを持たないものに対して 'getBackground()'が 'null'を返すと思います。 – CommonsWare

答えて

0

Viewのサイズは、背景に全く関係しません。ビューは背景を持たずにゼロ以外のサイズを持つことができます(うまくいけば!)。あなたはビューのbgを運ぶ必要はありません。

次に、findViewById(int)メソッドの詳細は非常に重い呼び出しです。一度呼び出す必要があります。

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final View mainView = findViewById(R.id.yourViewId) 
    mainView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      // At this stage of layout, if your view is well positioned, its width and height aren't zero 
      int width = mainView.getWidth(); 
      int height = mainView.getHeight(); 

      // Do whatever you want with view's size here 

      if (Build.VERSION.SDK_INT >= 16) { 
       mainView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } else { 
       mainView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 
     } 
    }); 
... 
} 
+0

他のいくつかのコードでは、ビューの高さと幅を返すコードが必要ですが、そのコードにエラーが表示されていません。私は確かにそれのためのIDがあり、IDは正しいと確信しています。また、私はちょうどそれの背景(透明な背景)を設定している場合でも、それは動作していません。 –

+0

getBackground()がnullを返す場合、幅/高さと背景の間に直接のリンクはありません。ビューにbgがないためです。そのため、背景になると予想されるLayerDrawableは、ビューのバックグラウンドではありません。まずRelativeLayoutの背景を設定する必要があります。 – Pdroid

+0

しかし、相対レイアウト(ルートレイアウトのように)を「マッチ親」、つまりデバイスの画面サイズ(テーマバーを除く)にしたいのですが?背景にはまったく依存しないサイズを取得するにはどうすればよいですか?または、この機能を実現するために任意のサイズのランダムな背景が必要ですか? –

関連する問題