web-dev-qa-db-fra.com

android: comment changer la mise en page sur un clic de bouton?

Je dois suivre le code pour sélectionner la disposition sur le clic du bouton.

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);

Lorsque je clique sur le bouton "AppView", la présentation change, mais lorsque je clique sur le bouton "DownloadView", rien ne se passe.

Ce lien dit que je dois commencer une nouvelle activité.

Mais je ne sais pas comment utiliser le code de l'intention de démarrer une nouvelle activité, un nouveau fichier sera-t-il ajouté?

EDIT: J'ai mon code sur la nouvelle activité:

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

    }
}

mais ça ne marche pas, ça force la fermeture, le logcat dit:enter image description here

22
Kris
  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 ");

    }
   }
  };

Remarque: dans ce cas, vous devez déclarer toutes vos activités dans le fichier .xml du manifeste, comme suit: 

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

EDIT: met à jour cette partie du code :): 

@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");
}

NB: vérifiez ceci (lien brisé). Didacticiel sur la manière de basculer entre les activités .

19
Houcine

Je voudrais ajouter un Android:onClick à la mise en page, puis changer la mise en page dans l'activité.

Donc, dans la mise en page 

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

Ensuite, dans l'activité, ajoutez ce qui suit:

public void changelayout(View view){
    setContentView(R.layout.second_layout);
}
8
cw1998

Vous vouliez changer la disposition au moment de l'exécution en cliquant sur le bouton. Mais cela n’est pas possible et comme il a été dit à juste titre ci-dessus, vous devez relancer l’activité. Vous rencontrerez un problème similaire lorsque vous prévoyez de changer de thème en fonction du choix de l'utilisateur, mais cela ne se reflétera pas à l'exécution. Vous devrez redémarrer l'activité.

2
cErEbRaL aSsAsSIN

Je sais que je vais arriver si tard, mais bon sang.

J'ai presque le même code que Kris, en utilisant une seule activité mais avec 2 présentations/vues différentes, et je souhaite basculer entre les présentations à volonté.

En guise de test, j’ai ajouté 2 options de menu, chacune d’elles basculant la vue:

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);
        }
    }

Remarque, j'ai un cours d'activité. Cela fonctionne parfaitement. Je ne vois donc pas pourquoi les gens suggèrent d’utiliser différentes activités/intentions. Peut-être que quelqu'un peut expliquer pourquoi mon code fonctionne, mais pas celui de Kris.

2
Kevin

Je pense que ce que vous essayez de faire devrait être fait avec plusieurs activités. Si vous apprenez Android, la compréhension d’Activités est une chose à laquelle vous devrez vous attaquer. Essayer d'écrire une application entière avec une seule activité finira par être beaucoup plus difficile. Lisez cet article pour commencer, vous devriez vous retrouver avec quelque chose de plus semblable à ceci:

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);
2
Gary Buyn

Le logcat montre l'erreur, vous devriez appeler super.onCreate(savedInstanceState):

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //... your code
}
1
candelapps

C'est très simple, il suffit de faire ceci:

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
arun bhati

Premièrement, je suggérerais de mettre un journal dans chaque cas de votre commutateur pour être sûr que votre code est appelé.

Ensuite, je vérifierais que les mises en page sont réellement différentes.

0
Jason Rogers