Выводить текст в несколько layout с одного MainActivity

Dmitrii

Проблема в AndroidStudio. Есть несколько Layout, есть MainActivity.java. Переключаюсь между ними через setContentView, через onClick() в Layout. Переключатся отлично! Такие команды, как finish() и SystemOutPrintln() тоже прекрасно запускаются. Но при подаче команды setText() всё крашится.

public class MainActivity extends ActionBarActivity  {
TextView tvOut;
Button btnStart;

public void onClickzadvopr(View v)
{
    setContentView(R.layout.shar);
}
public void onClickreshenie(View v)
{
    setContentView(R.layout.monetka);
}
public void onClickSigrkosti(View v)
{
    setContentView(R.layout.kosti);
}
public void onClickuznvolzvzd(View v)
{
    setContentView(R.layout.goroskop);
}
public void onClickNazad(View v)
{
    setContentView(R.layout.activity_main);
}
//public void onClickStart(View v) {tvOut.setText("Нажата кнопка ОК");  // Вот если эту строку сделать активной — всё крашится при нажатии на кнопку! 



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tvOut = (TextView) findViewById(R.id.tvOut);



}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    ***************().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}}

Глюк проявляется только при нажатии на кнопку. Пробовал другие способы вывода текста (создавал обработчик, заполнял метод onClick(), присваивал обработчик кнопке), тогда крашилось сразу же, как запускалось.

Если пробовать метод через switch(getId) и case — тоже крашится при нажатии кнопки. Мне говорили, что надо создавать другие активити через Intent Но неужели нельзя просто вывести текст из одного MainActivity.java в несколько разных Layout? Ведь по той же самой команде onClick() переключение и остальные команды прекрасно работают, почему не работает setText()? А вот как выглядит-то активити-кнопка, из которого крашит всё:

1 ответ

Dmitrii

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

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

Правило простое: одна разметка - одно активити, либо одна хост-активити, несколько фрагментов. Смысл в том, что у каждой разметки должен быть собственный контроллер, так как они не разделимы: вид на экране (разметка) и его управление (активити)

UPD

Конкретно в вашем случае причина ваших проблем кроется скорее всего в том, что в той разметке, еа которую вы подменяете первоначальную никакого виджета tvOut не существует или что еще хуже - это другой ID с тем же именем, что и в первоначальной разметке. Не смотря на то, что имена их одинаковы - это разные виджеты и вы обращаетесь к тому виджету, разметка которого уже не существует, а заменена на другую. Стоит заметить, что это одна из простейших проблем, которые вас ждут практикуя этот нелепый подход - дальше будет только намного хуже.

licensed under cc by-sa 3.0 with attribution.