GetWidth () возвращает 0 даже после применения обходного пути

Мой код 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 только последние несколько месяцев, так что будет полезно, если вы сможете объяснить в ясной манере.

Вы пытаетесь получить ширину пораньше. проверьте stackoverflow.com/questions/7733813/…

colorgreen 10.08.2018 00:46

@colorgreen Можете ли вы сказать мне, почему решение, с которым я связался, не работает для меня, но, по-видимому, работает для других парней, которые его пробовали? Упомянутый вами метод не кажется оптимальным, поэтому я постараюсь этого избежать.

harsh99 10.08.2018 01:15

Я не знаю, но я считаю, что время - причина. Макет еще не был раздут, и это просто случай, когда button.getWidth() в Runnable () был медленнее. Может, ты пробовал на более медленном телефоне, не знаю. Но на будущее, если вы хотите получить некоторые параметры макета в onCreate, вам нужно использовать решение из ссылки

colorgreen 10.08.2018 01:23

@colorgreen Я вообще не понимаю, как работает button.post. Уточните, пожалуйста?

harsh99 10.08.2018 01:40

Ох ... честно говоря, я впервые встречаю этот вариант использования, но я нашел что-то вроде этого stackoverflow.com/questions/8717145/…

colorgreen 10.08.2018 03:13

@colorgreen кажется немного недействительным в моей ситуации. Спасибо, в любом случае.

harsh99 10.08.2018 17:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте 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();
        }
    });

Звонить несколько раз было бы пустой тратой ресурсов, не так ли?

harsh99 10.08.2018 01:04

Да, если вам нужно, чтобы ширина была ненулевой только один раз, вы можете ограничить прослушиватель запуском только один раз, я обновил свой ответ кодом для этого. Многократный запуск не убьет вас, хотя, если вы не выполняете много работы, получение ширины представления не должно быть проблемой при многократном запуске.

CodeSmith 10.08.2018 01:21

Можете ли вы сказать мне, как я могу контролировать количество запусков?

harsh99 10.08.2018 01:37
Ответ принят как подходящий

вы можете использовать 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>

Другие вопросы по теме