добавлена кнопка программно в макет, но не отображается

#android

#Android

Вопрос:

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

 public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.songs_layout);
            LinearLayout layout = (LinearLayout) View.inflate(this, R.layout.songs_layout, null);

            Button myButton = new Button(this);
            myButton.setText("Change View");
            myButton.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
            layout.addView(myButton);


        }
  

Ответ №1:

Ваша layout переменная не совпадает с макетом, который вы использовали setContentView . Попробуйте вызвать setContentView(layout); after layout.addView(myButton); и удалить предыдущий вызов it ( setContentView(R.layout.songs_layout); ) .

Чтобы быть более понятным, ваш метод onCreate должен выглядеть следующим образом

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = (LinearLayout) View.inflate(this, R.layout.songs_layout, null);

    Button myButton = new Button(this);
    myButton.setText("Change View");
    myButton.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
    layout.addView(myButton);
    setContentView(layout);
}
  

Ответ №2:

Вы не устанавливаете кнопку на отображаемый макет. Вы раздуваете новый макет и добавляете к нему кнопку. Перейдите setContentView() к after layout.addView(myButton) , затем измените его на setContentView(layout) .

Ответ №3:

Решение для контекста фрагмента с помощью Kotlin: там Fragment , где представление раздувается в onCreateView решении, немного отличается. Возвращается раздутый макет:

 class MyFragment : Fragment()
    {
    lateinit var v: View

    override fun onCreateView(inflater: LayoutInflater,
                          container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
        v = inflater.inflate(R.layout.my_layout, container, false)
        // ...
        return v
    }
}
  

В этом случае может сбить с толку то, что выборка родительских кнопок с findViewById помощью и добавление кнопок в это представление не будут работать:

 val buttonsParent = v.findViewById<LinearLayout>(R.id.buttons_parent)
buttonsParent.addView(myButton)
  

Вместо этого вам нужно добавить кнопки напрямую со следующим синтаксисом:

 v.buttons_parent.addView(myButton)