Мой код Java:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
final TextView textView = (TextView) findViewById(R.id.text1);
final Button button = (Button) findViewById(R.id.button1);
button.post(new Runnable() {
@Override
public void run() {
int buttonWidth = button.getWidth();
int textWidth = textView.getWidth();
button.setWidth(buttonWidth-textWidth);
}
});
Мои представления xml:
<Button
android:id = "@+id/button1"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:text = "Timer"
android:textSize = "16sp"/>
<TextView
android:id = "@+id/text1"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:padding = "8dp"
android:text = "+5"/>
Я использую второй способ, описанный в этот ответ.
Я хочу, чтобы кнопка заполнила всю ширину с достаточным пространством для textView. Я изучаю Android только последние несколько месяцев, так что будет полезно, если вы сможете объяснить в ясной манере.
@colorgreen Можете ли вы сказать мне, почему решение, с которым я связался, не работает для меня, но, по-видимому, работает для других парней, которые его пробовали? Упомянутый вами метод не кажется оптимальным, поэтому я постараюсь этого избежать.
Я не знаю, но я считаю, что время - причина. Макет еще не был раздут, и это просто случай, когда button.getWidth()
в Runnable () был медленнее. Может, ты пробовал на более медленном телефоне, не знаю. Но на будущее, если вы хотите получить некоторые параметры макета в onCreate, вам нужно использовать решение из ссылки
@colorgreen Я вообще не понимаю, как работает button.post. Уточните, пожалуйста?
Ох ... честно говоря, я впервые встречаю этот вариант использования, но я нашел что-то вроде этого stackoverflow.com/questions/8717145/…
@colorgreen кажется немного недействительным в моей ситуации. Спасибо, в любом случае.
Используйте addOnGlobalLayoutListener вместо связанного решения, которое обычно работает у меня, когда я вижу эту проблему.
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT > 16) {
myView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
else {
myView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
myView.getWidth();
}
});
Звонить несколько раз было бы пустой тратой ресурсов, не так ли?
Да, если вам нужно, чтобы ширина была ненулевой только один раз, вы можете ограничить прослушиватель запуском только один раз, я обновил свой ответ кодом для этого. Многократный запуск не убьет вас, хотя, если вы не выполняете много работы, получение ширины представления не должно быть проблемой при многократном запуске.
Можете ли вы сказать мне, как я могу контролировать количество запусков?
вы можете использовать linearlayout с вашей кнопкой, имеющей вес 1, и вашим текстовым представлением для переноса содержимого.
попробуй это:
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "horizontal">
<Button
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_weight = "1" />
<TextView
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:text = "some text" />
</LinearLayout>
Вы пытаетесь получить ширину пораньше. проверьте stackoverflow.com/questions/7733813/…