Utilisation d'Intention dans une application Android pour afficher une autre activité

196

Dans mon application Android, j'ai deux classes d'activités. J'ai un bouton sur le premier et je veux afficher le second quand il est cliqué, mais j'obtiens une erreur. Voici les cours:

public class FirstActivity extends Activity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button orderButton = (Button)findViewById(R.id.order);

    orderButton.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View view) {
        Intent intent = new Intent(FirstActivity.this, OrderScreen.class);
        startActivity(intent);
      }

    });
  }
}

La deuxième classe qui devrait s'afficher lorsque le bouton est cliqué, mais ne le fait jamais:

public class OrderScreen extends Activity {

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.order);

    Button orderButton = (Button) findViewById(R.id.end);

    orderButton.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View view) {
        finish();
      }

    });
  }
}

Comment créer un bouton qui affichera la deuxième activité?

Tai Squared
la source
Obtenez-vous une erreur lors de la compilation ou de l'exécution? Dans les deux cas, quelle est l'erreur?
Quintin Robinson
3
Il s'agissait d'une erreur d'exécution. L'émulateur a donné l'erreur générique "l'application s'est arrêtée de façon inattendue", mais en utilisant le débogueur, il a montré une "android.content.ActivityNotFoundException: impossible de trouver la classe d'activité explicite {nom de classe} avez-vous déclaré cette activité dans votre AndroidManifest.xml?
Tai Squared
8
C'est un bug très courant que les gens oublient d'ajouter leur activité dans Manifest.xml mais il devrait y avoir moyen de l'entrer automatiquement.
AZ_

Réponses:

177

Le problème était que l' OrdreScreen Activity n'a pas été ajouté au fichier AndroidManifest.xml . Une fois que j'ai ajouté cela en tant que nœud d'application, cela a fonctionné correctement.

<activity android:name=".OrderScreen" />
Tai Squared
la source
Pouvez-vous expliquer pourquoi cela est nécessaire?
Louis Rhys
@LouisRhys toutes les activités doivent être déclarées dans le fichier manifeste. Voir la Descriptionsection ici: developer.android.com/guide/topics/manifest/…
ataulm
161

Ajoutez cette ligne à votre AndroidManifest.xml:

<activity android:name=".OrderScreen" /> 
user106011
la source
7
Pourquoi les gens ont-ils voté cette réponse des mois plus tard?
Jaykul
4
@Jaykul voir l'édition de 2013 dans la réponse acceptée
bombardier
16

---- FirstActivity.java -----

    package com.mindscripts.eid;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

public class FirstActivity extends Activity {

protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    Button orderButton = (Button) findViewById(R.id.order);
    orderButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(FirstActivity.this,OrderScreen.class);
            startActivity(intent);
        }
    });

 }
}

--- OrderScreen.java ---

    package com.mindscripts.eid;

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;



    public class OrderScreen extends Activity {
@Override



protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_class);
    Button orderButton = (Button) findViewById(R.id.end);
    orderButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            finish();
        }
    });

 }
}

--- AndroidManifest.xml ----

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.mindscripts.eid"
  android:versionCode="1"
  android:versionName="1.0">


<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".FirstActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".OrderScreen"></activity>
</application>

Sunil Chavan
la source
1
Vous voudrez peut-être expliquer votre réponse au profit de l'OP
Luca
4

Utilisez ce code:

Intent intent=new Intent(context,SecondActivty.class);
startActivity(intent);
finish();

contexte: se référer au contexte d'activité actuel,

veuillez vous assurer que vous avez ajouté une activité dans le fichier manifeste Android.

Code suivant pour ajouter une activité dans le fichier manifeste Android

<Activity name=".SecondActivity">
</Activity>
Mahesh
la source
java.lang.IllegalStateException: le fragment GetUserNumber {536bc00c} n'est pas attaché à l'activité.
Iman Marashi
4
<activity android:name="[packagename optional].ActivityClassName"></activity>

Ajouter simplement l'activité vers laquelle nous voulons basculer doit être placé dans le fichier manifeste

java dev
la source
3

Lorsque vous créez une activité dans un fichier Android, vous devez la spécifier dans AndroidManifest.xml comme

<uses-sdk android:minSdkVersion="8" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:name=".MyCreativityActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


     <activity android:name=".OrderScreen"></activity>


</application>

Android-iPhone-rahul
la source
3
b1 = (Button) findViewById(R.id.click_me);
        b1.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                Intent i = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(i);

            }
        });
Hiren Patel
la source
Ajoutez la classe SecondActivity dans votre fichier de manifeste.
Hiren Patel
La méthode setOnClickListener (View.OnClickListener) dans le type View n'est pas applicable pour les arguments (new OnClickListener () {})?
2

ajoutez l'activité dans votre fichier manifeste

<activity android:name=".OrderScreen" />
Neal Ahluvalia
la source
2

Dans le manifeste

<activity android:name=".OrderScreen" />

Dans le code Java où vous devez placer le code d'intention

startActivity(new Intent(CurrentActivity.this, OrderScreen.class);
Nilesh Panchal
la source
1
Il vous manque un support de fermeture dans startActivityIl devrait être comme ceci:startActivity(new Intent(CurrentActivity.this, OrderScreen.class));
Strange
1

vous pouvez utiliser le contexte de la vue qui a effectué l'appel. Exemple:

Button orderButton = (Button)findViewById(R.id.order);

orderButton.setOnClickListener(new View.OnClickListener() {

  @Override
  public void onClick(View view) {
    Intent intent = new Intent(/*FirstActivity.this*/ view.getContext(), OrderScreen.class);
    startActivity(intent);
  }

});
Bruno
la source
La méthode getContext () n'est pas définie pour le type MainActivity?
1
Intent i = new Intent("com.Android.SubActivity");
startActivity(i);
Ndupza
la source