Динамические представления с одним статическим xml

#android

#Android

Вопрос:

Прямо сейчас у меня есть XML-файл, в котором есть TableLayout внутри LinearLayout. Внутри TableLayout находятся TableRows с кнопками. В моем Java-коде я создаю setOnClickListener для каждой кнопки.

Проблема в том, что у меня есть несколько подобных XML-файлов, которые абсолютно одинаковы, за исключением того, что в xml идентификатор и текст разных кнопок отличаются.

Таким образом, один файл будет

 <Button android:id="@ id/one" android:text="one" /> 
<Button android:id="@ id/two" android:text="two" /> 
  

и другой файл, который будет

 <Button android:id="@ id/three" android:text="three" />
<Button android:id="@ id/four" android:text="four" />
  

В Java в одной части инструкции switch / case у меня есть случай, который:

 setContentView(R.layout.a);
Button bOne = (Button) findViewById(R.id.one);
Button bTwo = (Button) findViewById(R.id.two);
  

и еще у меня есть:

 setContentView(R.layout.b);
Button bThree = (Button) findViewById(R.id.three);
Button bFour = (Button) findViewById(R.id.four);
  

Избыточность распространяется на более чем два XML-файла, это всего лишь пример.

Есть ли какой-либо способ сделать это и не иметь нескольких файлов макета, но сделать все это в одном файле макета? Все XML-файлы абсолютно одинаковы, за исключением идентификаторов и текстовых частей кнопок.

Мне действительно все равно, как это делается — на Java, в xml или как угодно. Просто я время от времени вношу небольшие изменения в макет и не хочу продолжать настраивать каждый файл с точно таким же макетом, но для идентификаторов кнопок и текстов. Я хотел бы настроить макет один раз и заставить его работать во всех них при изменении макета. Если мне нужно поместить весь файл макета на Java, это было бы прекрасно.

Ответ №1:

просто сохраните один XML-файл (a.xml ). допустим, идентификаторами двух кнопок являются id1 и id2 . используйте setContentView(R.layout.a); . Далее объявляются 2 кнопки say b1 и b2 . установите b1 = (Button) findViewById(R.id.id1) и b2 = (Button) findViewById(R.id.id2) . поместите setOnClickListener для кнопок в корпус переключателя

Комментарии:

1. Ах, это сработало чудесно. Я изменил идентификаторы на общие, как вы предложили, и объявляю в Java общие. Я также добавляю setText в Java к кнопкам. Это работает отлично. Я предполагаю, что именно так я буду поступать впредь — статический макет в xml-файлах, если что-то в них динамическое, я идентифицирую это и выполняю все динамические операции в коде Java. Спасибо!

Ответ №2:

Если это всегда только эти две кнопки, у вас может быть переменная, отслеживающая произвольный int, который представляет, на каком экране вы находитесь. Оставьте те же кнопки, измените их параметры текста / компоновки и с помощью метода OnClick () протестируйте эту переменную, чтобы увидеть, на каком экране вы находитесь.

Ответ №3:

Почему бы просто не потерять XML-файлы и просто не сделать все это динамическим. Вы можете делать в коде все, что вы можете в xml. Вот руководство: Руководства по динамическому макету