2010-09-07 2 views
9

Я хочу определить доступную высоту и ширину родительского макета, к которому я должен добавить свое представление.Android - получить высоту родительского макета

Я использовал много методов на макете, как

  • layout.getHeight()
  • layout.getRootView(). GetHeight()

Все эти методы возвращают 0 (ноль), как результат.

Мое основное требование - предоставить ширину представления, составляющую некоторую часть ширины макета.

Также я не хочу использовать тег для этого. Я хочу сделать это с помощью кода.

Заранее спасибо.

ответ

5

Проблема заключается в том, что вы пытаетесь получить родительскую высоту/вес до того, как layoutmanager завершит родительский макет. Вы можете получить только размерность родителя после завершения его компоновки.

Рекомендуемый способ сделать то, что вы хотите достичь, используя поле layout_weight LayoutParams. link text

В частности, вы должны использовать:

LayoutParams lp = new LinearLayout.LayoutParams(width, height, 
weight); 

значение layout_weight может быть любым в диапазоне от 0,0 до 1,0. Так, например, если у меня есть MyButton в parentLayout, и я хочу MyButton занять 30% от родительского компоновщика ... Я хотел бы использовать что-то вроде:

myButton.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
               LayoutParams.WRAP_CONTENT,0.3)); 

layout_weight сумма всех дочерних элементов должно быть 1. Кроме того, layout_weight не следует использовать с шириной или высотой представления, установленной в LayoutParams.FILL_PARENT.

+0

Но как получить высоту и ширину родительского макета. ........... LayoutParams lp = new LinearLayout.LayoutParams (ширина, высота, вес); ......... Чтобы указать высоту в%, этот метод полезен только если у меня есть родительские макеты высота и ширина – Robin

+0

Нет, вам не нужно знать точную ширину/высоту родительского объекта для использования этого метода. Вы можете указать любое значение от 0 до 1 в качестве веса. Так, например, если у меня есть myButton внутри parentLayout, и я хочу, чтобы myButton занимал 30% родительского макета ... Я бы использовал что-то вроде: –

+0

жалкое пространство комментариев не хватило ... Я отредактировал свой ответ выше. –

7

Ok. Я нашел решение. Как мы можем получить hieght экрана в деятельности

getApplicationContext(). GetResources(). GetDisplayMetrics(). HeightPixels

Но я до сих пор не знаю, как получить пиксельные габаритах из родительского макета?

+0

Это не всегда одно и то же. С getApplicationContext(). GetResources(). GetDisplayMetrics(). HeightPixels вы получаете высоту экрана в пикселях. Если у вас есть (например) панель действий, это также включает панель действий, чего вы, вероятно, хотите избежать, если хотите узнать высоту в пикселях макета или элемента ui (фон или что-то еще) – Sotti

2

Один из вариантов программно реализовать это состоит в использовании метода следующие:

public void onWindowFocusChanged(boolean b) { ...} 

К тому времени этот метод вызывается, то процесс-Оформление печатных была закончена. Таким образом, вы можете правильно получить родительские атрибуты.

Как пример:

public class A extends Activity { 
    LinearLayout parent; 
    Button child; 
    public void onCreate(Bundle b) { 
     parent = (LinearLayout) findViewById(R.id.linear1); 
     child = (Button) findViewById(R.id.button1); 
     . 
     . 
    } 

@Override 
public void onWindowFocusChanged(boolean b) { 
     LayoutParams lpc = child.getLayoutParams(); 
     lpc.width = parent.getWidth(); 
     child.postInvalidate(); 
     . 
     . 
    } 
} 
0

В OnCreate() метод, если вы используете layout.getHeight() и layout.getWidth(), она возвращает 0, вместо этого вы можете следить за этим:

public void onClick(View v) { 
    // TODO Auto-generated method stub 

      int layWidth = Layout.getLeft(); 
      int layHeight = Layout.getHeight(); 
     break;  
    } 
+0

Он возвращает '0 'потому что пользовательский интерфейс не имеет времени для отображения. Возможно, лучше использовать «Runnable» внутри 'onCreate' или использовать метод' 'onWindowFocusChanged' (http://developer.android.com/reference/android/view/View.html#onWindowFocusChanged%28boolean%29) внутри активность как [Robeth] (http://stackoverflow.com/a/10269753/2668136) упоминается вместо использования прослушивателя кликов для изменения представлений. – Fllo

3

Попробуйте что-то вроде этого:

view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    public void onGlobalLayout() { 
     view.getHeight(); 
    } 
    }); 
0

Вы, вероятно, звоните getHeight() до раннего. Убедитесь, что getParent().getHeight() вызывается после viewGroup.addView(view0) и/или setContentView(activity_main.xml). Это случилось со мной в прошлом, и это зафиксировало это.

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