Android: как изменить макет по нажатию кнопки? - PullRequest
23 голосов
/ 25 мая 2011

Мне нужен следующий код для выбора макета при нажатии кнопки.

View.OnClickListener handler = new View.OnClickListener(){
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.DownloadView: 
                // doStuff
                setContentView(R.layout.main);
                break;
            case R.id.AppView: 
                // doStuff
                setContentView(R.layout.app);
                break;
        }
    }
};

findViewById(R.id.DownloadView).setOnClickListener(handler);
findViewById(R.id.AppView).setOnClickListener(handler);

Когда я нажимаю кнопку «AppView», макет меняется, но когда я нажимаю кнопку «DownloadView», ничего не происходит.

Эта ссылка говорит о том, что я должен начать новую деятельность.

Но я не знаю, как использовать там код намерения начать новое действие, будет ли добавлен новый файл?

EDIT: У меня есть мой код для новой деятельности:

package com.example.engagiasync;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class AppView extends Activity implements OnClickListener{


    @Override
    public void onCreate(Bundle savedInstanceState){

        setContentView(R.layout.app);

        TextView tv = (TextView) this.findViewById(R.id.thetext);
        tv.setText("App View yo!?\n");
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }
}

но это не работает, оно принудительно закрывается, logcat говорит: enter image description here

Ответы [ 8 ]

20 голосов
/ 25 мая 2011
  Button btnDownload = (Button) findViewById(R.id.DownloadView);
  Button btnApp = (Button) findViewById(R.id.AppView);

  btnDownload.setOnClickListener(handler);
  btnApp.setOnClickListener(handler);

  View.OnClickListener handler = new View.OnClickListener(){

  public void onClick(View v) {

    if(v==btnDownload){ 
            // doStuff
            Intent intentMain = new Intent(CurrentActivity.this , 
                                           SecondActivity.class);
            CurrentActivity.this.startActivity(intentMain);
            Log.i("Content "," Main layout ");
    }

    if(v==btnApp){ 
            // doStuff
            Intent intentApp = new Intent(CurrentActivity.this, 
                                          ThirdActivity.class);

            CurrentActivity.this.startActivity(intentApp);

            Log.i("Content "," App layout ");

    }
   }
  };

Примечание: и затем вы должны объявить все свои действия в XML-файле манифеста следующим образом:

<activity android:name=".SecondActivity" ></activity>
<activity android:name=".ThirdActivity" ></activity>

РЕДАКТИРОВАТЬ: обновить эту часть кода :):

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);// Add THIS LINE

    setContentView(R.layout.app);

    TextView tv = (TextView) this.findViewById(R.id.thetext);
    tv.setText("App View yo!?\n");
}

Примечание: установите этот флажок (Неработающая ссылка) Учебное пособие по переключению между действиями .

10 голосов
/ 23 июля 2012

Я бы добавил android:onClick к макету и затем изменил макет в упражнении.

Итак, в макете

<ImageView
(Other things like source etc.)
android:onClick="changelayout"
/>

Затем в упражнении добавьте следующее:

public void changelayout(View view){
    setContentView(R.layout.second_layout);
}
2 голосов
/ 29 июня 2012

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

2 голосов
/ 13 октября 2011

Я знаю, что приеду так поздно, но какого черта.

Я получил почти тот же код, что и Kris, используя только одно действие, но с двумя разными макетами / видами, и я хочу переключаться между макетами по желанию.

В качестве теста я добавил 2 пункта меню, каждый из которых переключает вид:

public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.item1:
                setContentView(R.layout.main);
                return true;
            case R.id.item2:
                setContentView(R.layout.alternate);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

Обратите внимание, у меня есть один класс деятельности. Это работает отлично. Поэтому я понятия не имею, почему люди предлагают использовать разные виды деятельности / намерения. Может быть, кто-то может объяснить, почему мой код работает, а Крис - нет.

2 голосов
/ 25 мая 2011

Я думаю, то, что вы пытаетесь сделать, должно быть сделано с помощью нескольких действий.Если вы изучаете Android, вам нужно разобраться в «Деятельности».Попытка написать целое приложение только с одним действием в конечном итоге будет намного сложнее.Прочитайте эту статью , чтобы начать, тогда вы должны получить что-то вроде этого:

View.OnClickListener handler = new View.OnClickListener(){
    public void onClick(View v) {

        switch (v.getId()) {

            case R.id.DownloadView: 
                // doStuff
                startActivity(new Intent(ThisActivity.this, DownloadActivity.class));
                break;
            case R.id.AppView: 
                // doStuff
                startActivity(new Intent(ThisActivity.this, AppActivity.class));
                break;
        }
    }
};

findViewById(R.id.DownloadView).setOnClickListener(handler);
findViewById(R.id.AppView).setOnClickListener(handler);
1 голос
/ 20 марта 2013

LogCat показывает ошибку, вы должны позвонить super.onCreate(savedInstanceState):

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //... your code
}
0 голосов
/ 28 апреля 2014

Это очень просто, просто сделайте это:

t4.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {

            launchQuiz2();          // TODO Auto-generated method stub

        }

        private void launchQuiz2() {
            Intent i = new Intent(MainActivity.this, Quiz2.class);
            startActivity(i);
            // TODO Auto-generated method stub

        }

    });
0 голосов
/ 25 мая 2011

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

Тогда я бы проверил, что макеты на самом деле разные.

...