-2

私はプロジェクトに取り組んでいます。プログラミング コードを使用して、アクティビティから LinearLayout の幅と高さが必要です。この Linear Layout は width と Height が固定されています。しかし、次を使用すると..Nullpointer Exceptionが発生します

LinearLayout viewGroup = (LinearLayout) context.findViewById(R.id.popup);
Log.e("getWidth",""+viewGroup.getWidth());
Log.e("getHeight",""+viewGroup.getHeight());

アクティビティからそのレイアウトの幅と高さが必要です。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/popup"
android:layout_width="150dp"
android:layout_height="252dp"
android:background="#303030"
android:orientation="vertical" >
</LinearLayout>

ここにJavaコードファイルがあります

public class MainActivity extends Activity {

//The "x" and "y" position of the "Show Button" on screen.
Point p;
Button btn_show;

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

  btn_show = (Button) findViewById(R.id.show_popup);

}



@Override
protected void onResume() {
    super.onResume();
     btn_show.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View arg0) {

           //Open popup window
           if (p != null)
           showPopup( p);
         }
       });
}



// Get the x and y position after the button is draw on screen
// (It's important to note that we can't get the position in the onCreate(),
// because at that stage most probably the view isn't drawn yet, so it will return (0, 0))
@Override
public void onWindowFocusChanged(boolean hasFocus) {

   int[] location = new int[2];
   Button button = (Button) findViewById(R.id.show_popup);

   // Get the x, y location and store it in the location[] array
   // location[0] = x, location[1] = y.
   button.getLocationOnScreen(location);

   //Initialize the Point with x, and y positions
   p = new Point();
   p.x = location[0];
   p.y = location[1];
}

// The method that displays the popup.
private void showPopup( Point p) {
   int popupWidth = 200;
   int popupHeight = 380;

   // Inflate the popup_layout.xml
   LinearLayout viewGroup = (LinearLayout) findViewById(R.id.popup);
   LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
   View layout = layoutInflater.inflate(R.layout.a, viewGroup);
   Log.e("getWidth",""+viewGroup.getWidth());
   Log.e("getHeight",""+viewGroup.getHeight());

   // Creating the PopupWindow
   final PopupWindow popup = new PopupWindow(getApplicationContext());
   popup.setContentView(layout);
   popup.setWidth(viewGroup.getWidth());
   popup.setHeight(viewGroup.getHeight());
   popup.setFocusable(true);

   // Some offset to align the popup a bit to the right, and a bit down, relative to button's position.
   int OFFSET_X = 30;
   int OFFSET_Y = 30;

   // Clear the default translucent background
   popup.setBackgroundDrawable(new BitmapDrawable());

   // Displaying the popup at the specified location, + offsets.
   popup.showAtLocation(layout, Gravity.NO_GRAVITY, p.x + OFFSET_X, p.y + OFFSET_Y);

   // Getting a reference to Close button, and close the popup when clicked.
  // Button close = (Button) layout.findViewById(R.id.close);
  /* close.setOnClickListener(new OnClickListener() {

     @Override
     public void onClick(View v) {
       popup.dismiss();
     }
   });*/
}
}
4

4 に答える 4

0

メソッドView.onSizeChanged()が最初に呼び出されて初めてgetHeight()、メソッドとメソッドを確実に使用できますgetWidth()。つまり、この事実を考慮してアプリのロジックを変更する必要があります。

于 2013-08-28T11:32:45.110 に答える
0

ビューがアタッチされてレイアウトに配置されるのを待つには、ViewTreeObserver.OnGlobalLayoutListenerを使用する必要があります。

次のように登録できます。

v.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() {

 public void onGlobalLayout() {

          //TODO: do your stuff here

          //if you change something in the layout you have to add this
          //line to avoid loops
          v.getViewTreeObserver().removeGlobalOnLayoutListener(this);
  }

});

そのコールバックでは、ビューの位置と寸法が一貫していることを確認できます。

于 2013-08-28T12:17:42.243 に答える
0

これはViewGroupまだ作成されていない可能性があります。

ビューなどの表示オブジェクトが作成された後に、このオブジェクトの幅と高さを取得しようとしている場所が実際に呼び出されていることを確認してください。などのさまざまな読み込みメソッドにブレークポイントを配置するか、代わりに を配置することで、これをデバッグonCreateできますonResumeNSLog

于 2013-08-28T11:18:25.880 に答える
0

幅と高さを取得するためだけにレイアウトを膨らませていますね。もしそうなら、viewGroup は必要ありません。R.layout.popup_layout が、固定寸法を持つ LinearLayout を指していると仮定します。

LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout layout = layoutInflater.inflate(R.layout.popup_layout, null);
LayoutParams params = layout.getLayoutParams();
Log.e("getWidth",""+params.width);
Log.e("getHeight",""+params.height);

その後、ポップアップを設定できます:

final PopupWindow popup = new PopupWindow(getApplicationContext());
popup.setContentView(layout);
popup.setWidth(params.width);
popup.setHeight(params.height);
popup.setFocusable(true);
于 2013-08-28T12:03:10.120 に答える