2017-01-04 3 views
1

Я знаю, что это, вероятно, не самый лучший вопрос, который можно задать здесь из-за отсутствия исследований, но на самом деле я понятия не имею, с чего начать искать здесь. Кажется, все должно работать нормально. В любом случае, я пытаюсь добавить несколько кнопок в пользовательский интерфейс приложения, чтобы гарантировать, что пользовательский интерфейс подходит и адаптируется ко всем экранам без проблем. Here is a very rough idea of the format I'm needing (with text in each button of course)Программируемое добавление кнопок к относительной компоновке

And this is what I'm getting.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    layout = (RelativeLayout) findViewById(R.id.activity_main); 
    Point size = new Point(); 
    Display display = getWindowManager().getDefaultDisplay(); 
    display.getRealSize(size); 
    params = new RelativeLayout.LayoutParams(size.x/5, 200); 
    padding = size.x/5; 
    addButtons(); 
} 

public void addButtons() { 
    Button update = new Button(this); 
    RelativeLayout.LayoutParams updateParams = params; 
    updateParams.addRule(RelativeLayout.CENTER_VERTICAL); 
    update.setLayoutParams(updateParams); 
    update.setPadding(padding, 0, 0, 0); 
    update.setText("Update Me!"); 
    update.setOnClickListener(new ClickHandler("app_update")); 
    updateId = update.generateViewId(); 
    update.setId(updateId); 
    layout.addView(update); 

    Button install = new Button(this); 
    RelativeLayout.LayoutParams installParams = params; 
    installParams.addRule(RelativeLayout.RIGHT_OF, update.getId()); 
    installParams.addRule(RelativeLayout.CENTER_VERTICAL); 
    install.setLayoutParams(installParams); 
    install.setPadding(padding, 0, 0, 0); 
    install.setText("Install LastBox"); 
    install.setOnClickListener(new ClickHandler("kodi_install")); 
    installId = install.generateViewId(); 
    install.setId(installId); 
    layout.addView(install); 

    Button dlFamily = new Button(this); 
    RelativeLayout.LayoutParams dlFamilyParams = params; 
    dlFamilyParams.addRule(RelativeLayout.RIGHT_OF, install.getId()); 
    dlFamilyParams.addRule(RelativeLayout.ABOVE, install.getId()); 
    dlFamily.setLayoutParams(dlFamilyParams); 
    dlFamily.setPadding(padding, 0, 0, padding); 
    dlFamily.setText("Download Family Build"); 
    dlFamily.setOnClickListener(new ClickHandler("family_download")); 
    dlFamilyId = dlFamily.generateViewId(); 
    dlFamily.setId(dlFamilyId); 
    layout.addView(dlFamily); 

    Button upFamily = new Button(this); 
    RelativeLayout.LayoutParams upFamilyParams = params; 
    upFamilyParams.addRule(RelativeLayout.RIGHT_OF, install.getId()); 
    upFamilyParams.addRule(RelativeLayout.BELOW, install.getId()); 
    upFamily.setLayoutParams(upFamilyParams); 
    upFamily.setPadding(padding, padding, 0, 0); 
    upFamily.setText("Update Family Build"); 
    upFamily.setOnClickListener(new ClickHandler("family_update")); 
    upFamilyId = upFamily.generateViewId(); 
    upFamily.setId(upFamilyId); 
    layout.addView(upFamily); 

    Button dlAdult = new Button(this); 
    RelativeLayout.LayoutParams dlAdultParams = params; 
    dlAdultParams.addRule(RelativeLayout.RIGHT_OF, dlFamily.getId()); 
    dlAdultParams.addRule(RelativeLayout.ABOVE, install.getId()); 
    dlAdult.setLayoutParams(dlAdultParams); 
    dlAdult.setPadding(padding, 0, 0, padding); 
    dlAdult.setText("Download Adult Build"); 
    dlAdult.setOnClickListener(new ClickHandler("adult_download")); 
    dlAdultId = dlAdult.generateViewId(); 
    dlAdult.setId(dlAdultId); 
    layout.addView(dlAdult); 

    Button upAdult = new Button(this); 
    RelativeLayout.LayoutParams upAdultParams = params; 
    upAdultParams.addRule(RelativeLayout.RIGHT_OF, upFamily.getId()); 
    upAdultParams.addRule(RelativeLayout.BELOW, install.getId()); 
    upAdult.setLayoutParams(upAdultParams); 
    upAdult.setPadding(padding, padding, 0, 0); 
    upAdult.setText("Update Adult Build"); 
    upAdult.setOnClickListener(new ClickHandler("adult_update")); 
    upAdultId = upAdult.generateViewId(); 
    upAdult.setId(upAdultId); 
    layout.addView(upAdult); 
} 

Я даже не смотря на то волшебным «исправить это для меня, потому что я слишком ленив» решение. Направьте меня в правильном направлении, покажите мне, где мне нужно выглядеть, вот так. Мне нравится решать эти проблемы, но начинать в нужном месте было бы чудесно.

ответ

0

Вы используете тот же RelativeLayout.LayoutParams params для всех своих кнопок. В Java все не примитивные типы заданий сделаны ссылки, поэтому, когда вы делаете

RelativeLayout.LayoutParams updateParams = params; 
RelativeLayout.LayoutParams installParams = params; 
RelativeLayout.LayoutParams dlFamilyParams = params; 

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

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

Таким образом, вы устанавливаете тот же объект params на все ваши кнопки.

Сочетание этих ошибок приводит к тому, что все ваши кнопки с одинаковыми параметрами RelativeLayout.LayoutParams с его настройками расположены один над другим, и вы можете видеть только последнее добавленное.

Вы должны создать другой объект Params для каждой кнопки, как следует:

RelativeLayout.LayoutParams updateParams = new RelativeLayout.LayoutParams(size.x/5, 200); 
... 
RelativeLayout.LayoutParams installParams = new RelativeLayout.LayoutParams(size.x/5, 200); 
... 

Проанализировать взгляды проблемы, которые я предлагаю использовать Layout инспектор инструмент, доступный по меню Инструменты -> Android

+0

Благодарим за ответ. Это сделал трюк. Я больше всего знаком с C++, поэтому мне было странно обнаруживать, что большинство переменных в Java являются справочными! Захватывающий. Во всяком случае, кнопки не имеют в них текста, несмотря на мои методы setText на каждой кнопке. Есть идеи? –

0

попробовать это

RelativeLayout layout = (RelativeLayout)findViewById(R.id.activity_main); 
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 


for (int i=0; i<10; i++) { 
    Button button= new Button(this); 
    button.setText("some_text"); 
    button.setId(i); 

    // lp.addRule(RelativeLayout.RIGHT_OF, <Id>); 

    layout.addView(tv2, lp); 
} 
Смежные вопросы