2016-10-27 7 views
0

У меня есть макет, который является чем-то вроде этого:Как проверить программно, если все Просмотров уместиться на экране

LinearLayout (linearLayout) 
'--TextView (textView1) 
'--ImageView (imageView) 
'--TextView (textView2) 

textView1 меняет свой текст иногда и это может быть долго, поэтому он оставляет часть textView2 из экрана. Я хочу предотвратить это, поэтому я хочу удалить imageView из макета всякий раз, когда это происходит. imageView может отображаться или не отображаться в момент его вычисления (возможно, он был удален до того, как ранее был изменен textView1).

Это то, что я закодирован:

void changeText(String veryLongString){ 

    textView1.setText(veryLongString); 

    int [] loc = new int [2]; 
    textView2.getLocationOnScreen(loc); 
    int bottom = textView2.getMeasuredHeight() + loc[1]; 

    if (imageView.getVisibility() == View.GONE) 
     bottom += imageView.getHeight(); 

    if (bottom > linearLayout.getMeasuredHeight()){ 
     imageView.setVisibility(View.GONE); 
    } else { 
     imageView.setVisibility(View.VISIBLE); 
    } 
} 

Но по каким-то причинам это не работает, как и следовало ожидать, потому что кажется, как будто изменения в положении и высоту соображений происходят не сразу , Когда я вызываю getMeasuredHeight() и getLocationOnScreen(), я получаю значения ПЕРЕД изменениями, которые я только что сделал. Результат, который я получаю, заключается в том, что если я установил очень большой текст, изображение не будет удалено, но если я затем установлю короткий текст, он будет удален. Если есть другие способы решения этой проблемы?

ответ

1

Хотя я считаю, что это неправильный подход (вы можете делать всевозможные вещи в своем XML, чтобы вам не приходилось вмешиваться в Java-код), вот краткий пример того, что вы можете сделать из Java (например, в вашем методе onStart())

ViewGroup group = (ViewGroup) findViewById(R.id.myLayout); 
    int groupHeight = group.getHeight(); 
    for (int i = 0; i < group.getChildCount(); i++) { 
     groupHeight -= group.getChildAt(i).getHeight(); 
     if (groupHeight < 0) { 
      // they don't fit in the layout 
      myImageView.setVisibility(View.GONE); 
     } 
    } 
+1

Я уважаю это, даю ответ и лучшее предложение. Во-вторых, тот факт, что реструктуризация XML может решить проблему намного лучше, чем полукоммерческое измерение вида. – zgc7009

+0

Как вы думаете, какой правильный подход? Я открыт для внесения изменений в свой XML. Просто подумайте, что я изменяю тексты внутри TextViews программно. – iguarna

+1

@iguarna a RelativeLayout с такими вещами, как 'layout_above' и' layout_alignParentBottom', должно быть хорошим началом. Я могу сказать, что мне потребовалось довольно много времени, чтобы хорошо манипулировать XML-файлами, но все учатся в разных расценках: P – zgc7009