2016-03-24 10 views
1

Wie navigiere ich zu einer wiederverwendbaren Aktivität und navigiere dann "AUF" zur aufrufenden Aktivität?Zurück zu einer wiederverwendbaren Aktivität navigieren

enter image description here

Ich habe einen MainActivity, die ich nennen:

Intent intent = new Intent(MainActivity.this, ReusableActivity.class); 
intent.put("SomeName", SomeData); 
startActivity(intent); 

Und ich habe eine OTHER, die das ReusableActivity nennt auch.

Intent intent = new Intent(OtherActivity.this, ReusableActivity.class); 
intent.put("SomeName", SomeData); 
startActivity(intent); 

In meinem ReusableActivity Ich habe eine Symbolleiste, die den „UP“ Pfeil werden angezeigt, so dass der Benutzer zurück navigieren kann.

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.ReusableActivity); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    } 

Wie bekomme ich ReusableActivity, um den Benutzer wieder an die richtige Anrufaktivität zu senden?

Also, wenn ich auf dem OTHER bin und gehen Sie zu ReusableActivity, wenn der Benutzer die Aufwärtstaste drückt, gehen sie zurück zu OTHER

Manifestdatei

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.myCompany.myApp"> 


    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".LoginActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:windowSoftInputMode="adjustPan"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" 
      android:theme="@style/AppTheme.NoActionBar" /> 
     <activity 
      android:name=".SearchView" 
      android:label="@string/title_activity_search_view" 
      android:parentActivityName=".MainActivity" 
      android:screenOrientation="portrait" 
      android:theme="@style/AppTheme.NoActionBar" 
      android:windowSoftInputMode="adjustPan|adjustResize"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.myCompany.myApp.MainActivity" /> 
     </activity> 
     <activity 
      android:name=".SearchResultsList" 
      android:label="@string/title_activity_search_results_list" 
      android:parentActivityName=".SearchView" 
      android:screenOrientation="portrait" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.myCompany.myApp.SearchView" /> 
     </activity> 
     <activity 
      android:name=".ReusableActivity" 
      android:label="@string/title_activity_details" 
      android:parentActivityName=".SearchResultsList" 
      android:screenOrientation="portrait" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.myCompany.myApp.SearchResultsList" /> 
     </activity> 
     <activity 
      android:name=".OtherActivity" 
      android:label="@string/title_activity_other" 
      android:parentActivityName=".MainActivity" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="com.myCompany.myApp.MainActivity" /> 
     </activity> 
    </application> 

</manifest> 
+0

So möchten Sie die Taste "Home" ein "zurück" statt ein "up" zu sein? Setzen Sie 'DisplayHomeAsUpEnabled (true)' nicht, wenn Sie nicht möchten, dass es tatsächlich ein Up ist. Siehe [Navigation mit Zurück und Hoch] (https://developer.android.com/design/patterns/navigation.html) – dsh

+0

Aus irgendeinem Grund, wenn ich auf Andere bin und auf Reusealbe gehe, wenn der Benutzer die Zurück-Taste drückt, sind sie stattdessen nach Main genommen. –

+0

Die Schaltfläche Zurück befindet sich nicht in der Symbolleiste. Wenn Sie es nicht übersteuert haben, werden Sie zurück zu "Andere" gehen. Up ist jedoch ganz anders als Back. Siehe die Android-Dokumentation, die ich zum Thema verlinkt habe. – dsh

Antwort

-1

nicht sicher, ob ich verstehe Ihre Frage. Rufen Sie einfach finish() an, wenn der Benutzer den Zurück-Pfeil drückt?

0

Graveur ist eigentlich richtig nicht sicher, warum unten gewählt wurde. Wenn Sie in Ihrer ReusableActivity die UP-Taste (Zurück-Pfeil in der Symbolleiste) drücken, können Sie finish() aufrufen, die ReusableActivity wird geschlossen und die letzte Aktivität wird angezeigt, die entweder MainActivity oder OtherActivity aus Ihrem Diagramm ist.

Das heißt, Sie müssen onOptionsItemSelected überschreiben, um benachrichtigt zu werden, wenn die UP-Taste in der Symbolleiste gedrückt wird.

Vergewissern Sie sich auch, dass Sie getSupportActionBar().setDisplayHomeAsUpEnabled(true); für die Aktivität aufrufen, um die Schaltfläche "Hoch" anzuzeigen.

ReusableActivity

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: // Notice the id for the up button 
      finish(); // Up button pressed so call finish. 
      return(true); 
    } 

    return(super.onOptionsItemSelected(item)); 
} 

HINWEIS:

Sie könnten das Meta-Tag aus dem ReusableActivity im Manifest zu entfernende Verwirrung zu vermeiden, was die übergeordnete Aktivität da sein wird, wird es programmatisch überschrieben werden.

Alternative

Wenn aus irgendeinem Grund Sie nicht wollen, finish() rufen Sie können stattdessen eine neue Tätigkeit beginnen. Diese Absicht wird sicherstellen, dass die vorherige Aktivität gestartet wird, sodass Sie nicht den Überblick behalten müssen.

Intent i = new Intent(this, MainActivity.class); 
i.setAction(Intent.ACTION_MAIN); 
i.addCategory(Intent.CATEGORY_LAUNCHER); 
startActivity(i); 

Sie sollten den Launcher Aktivität der Absicht (MainActivity.class) übergeben, unabhängig davon, welche Tätigkeit tatsächlich gestartet werden, die Aktion und die Kategorie in der Absicht, die richtige Aktivität des Beginnens

kümmern

EDIT:

Da Sie Probleme mit waren es diese Alternative den Weg zur Arbeit habe ich.

Sie können diese andere Methode versuchen, wenn Sie ReusableActivity durch eine Absicht passieren die Klasse der Aktivität starten, die ReusableActivity und wenn die Aufwärtstaste gedrückt wird einfach starten, die Aktivität startet:

Intent intent = new Intent(MainActivity.this, ReusableActivity.class); 
//the activity you want to start when pressing the up button 
intent.put("parent", MainActivity.this); 
startActivity(intent); 

Sie die gleiche beim Start ReusableActivity von OTHER:

Intent intent = new Intent(OtherActivity.this, ReusableActivity.class); 
//the activity you want to start when pressing the up button 
intent.put("parent", OtherActivity.this); 
startActivity(intent); 

Nun, wenn die Aufwärtstaste auf OptionsActivity gedrückt werden Sie in der Lage sein, die richtige Aktivität zu starten.

OptionsActivity

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 

      Class<?> parentActivityClass = (Class<?>)getIntent().getSerializableExtra("parent"); 
      Intent intent = new Intent(this, parentActivityClass); 
      startActivity(intent); 

      return(true); 
    } 

    return(super.onOptionsItemSelected(item)); 
} 
+0

Hmm .... das hat nicht funktioniert. Ich habe sichergestellt, dass das vollständige Meta-Tag entfernt wurde. Das wiederverwendbare Objekt kehrt immer noch zur MainActivity zurück. –

+0

Haben Sie OnOptionsSetelected in ReusableActivity oder in einer anderen Aktivität überschrieben? Können Sie nach dem Aufruf von finish ein Protokoll hinzufügen, um sicherzustellen, dass es aufgerufen wird. – leonziyo

+0

überschrieb ich in wiederverwendbar. Ich habe es protokolliert und es heißt. Aber immer noch zurück zu Main –

Verwandte Themen