2013-08-28 2 views
-2

Я работаю над проектом. Мне нужна ширина & Высота LinearLayout из действия с использованием кода программирования. Этот линейный макет имеет фиксированную ширину и высоту. Но когда я использую следующие ..Я подвожу NullPointer ExceptionИсключение NullPointer в getWidth(), getHeight()

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

общественного класса MainActivity расширяет активность {

//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(); 
    } 
    });*/ 
} 
} 
+0

О чем говорит 'context'? –

+0

Можете ли вы опубликовать полный код? –

+0

что это за «контекст»? Вы использовали 'setContentView' перед этими строками? – Selvin

ответ

0

Может быть, это ViewGroup не создан.

Проверить, когда вы пытаетесь получить ширину и высоту этого объекта, на самом деле вызываются после создания объектов отображения, таких как представления и т. Д. Вы можете отлаживать это путем размещения точек останова в разных методах загрузки, таких как onCreate, onResume или путем размещения в них NSLog.

0

только один раз метода View.onSizeChanged() привлекаемых для первого вы можете надежно использовать getHeight() и getWidth() методы. Это означает, что вам придется изменить логику вашего приложения, чтобы учесть этот факт.

+0

где я использую этот метод? –

+0

Я точно не знаю, как это сделать, но я создал только созданные пользовательские представления, а не настраиваемые макеты, но макеты являются потомками View. Я думаю, что вам нужно будет создать класс Java с тем же именем, что и ваш макет, который является потомком одного из классов макета. Затем вам необходимо переопределить метод onSizeChanged() и создать всплывающее окно в этом методе, поскольку размер будет известен. Затем вам нужно изменить свой XML-макет, чтобы использовать свой собственный макет вместо стандартных Android. См. Http://developer.android.com/reference/android/view/ViewGroup.html. – Kerry

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); 
0

ждать мнений быть присоединен и помещен в макете вы должны использовать ViewTreeObserver.OnGlobalLayoutListener.

вы можете зарегистрировать его, как это:.

v.getViewTreeObserver() addOnGlobalLayoutListener (новый 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); 
    } 

});

В этом обратном вызове вы можете быть уверены, что у вас есть вид с состоянием и размером консистенции.

Смежные вопросы