Aktionsleiste Die Schaltfläche Zurück funktioniert nicht

73

Mit Hilfe dieser Android- Dokumente. Ich versuche, eine Schaltfläche zum Zurücksetzen der Aktionsleiste zu erstellen. Ich erhalte eine Schaltfläche zum Zurücksetzen der Aktionsleiste wie folgt:

Geben Sie hier die Bildbeschreibung ein

Ausgabe:

Aber mein Problem ist, nachdem ich die Bilder der Galerie angesehen habe, drücke ich auf action bar back button.

Dann. it is not workingAber es muss go back to previous page.

Nachfolgend sind die Codierungen aufgeführt.

GalleryActivity.java:

    import android.app.ActionBar;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.NavUtils;
    import android.view.MenuItem;

    import com.fth.android.R;

   public class GalleryActivity extends FragmentActivity {

    private int position;
    private static String id;
    private static String name;
    private DemoCollectionPagerAdapter mDemoCollectionPagerAdapter;
    private ViewPager mViewPager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_gallery);

            position = getIntent().getExtras().getInt("position");

            id = getIntent().getExtras().getString("id");

            name = getIntent().getExtras().getString("name");

            mDemoCollectionPagerAdapter = new DemoCollectionPagerAdapter(getSupportFragmentManager());

            // Set up action bar.
            final ActionBar actionBar = getActionBar();


            actionBar.setDisplayHomeAsUpEnabled(true);

           // getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME|ActionBar.DISPLAY_USE_LOGO|ActionBar.DISPLAY_HOME_AS_UP);

            // Set up the ViewPager, attaching the adapter.
            mViewPager = (ViewPager) findViewById(R.id.pager);
            mViewPager.setAdapter(mDemoCollectionPagerAdapter);
        }

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

                    Intent upIntent = new Intent(this, HomeActivity.class);
                    upIntent.putExtra("position", position);
                    if (NavUtils.shouldUpRecreateTask(this, upIntent)) {

                        TaskStackBuilder.from(this)
                                .addNextIntent(upIntent)
                                .startActivities();
                        finish();
                    } else {

                        NavUtils.navigateUpTo(this, upIntent);
                    }
                    return true;
            }
            return super.onOptionsItemSelected(item);
        }


      }

GalleryDetailFragment.java:

import com.sit.fth.model.GalleryDetail;
import com.sit.fth.util.APIServiceHandler;
import com.sit.fth.util.AppConstants;
import com.sit.fth.util.AppPromoPager;

public class GalleryDetailFragment extends BaseFragment implements
        PromoPagerListener {


    private TextView countView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        this.setHasOptionsMenu(true);
        id = getArguments().getString("id");
        name = getArguments().getString("name");
        View view = inflater.inflate(R.layout.app_pager, null);



        return view;
    }

}

Jeder kann mir helfen, wenn Sie wissen, wie man diese löst. Danke.

Steve
quelle
1
Haben Sie versucht, ParentActivities in AndroidManifest zu deklarieren?
x90
@ x90 überprüfe meinen bearbeiteten Beitrag.
Steve
Möchten Sie Android wirklich definieren: parentActivityName = "com.sit.fth.activity.HomeActivity" zu com.sit.fth.activity.HomeActivity? Sie sollten HomeActivity beispielsweise als übergeordnete Aktivität für GalleryActivity definieren. Nicht für sich.
x90
@ x90 HomeActivity ist eine mainActivity (Elternaktivität)
Steve

Antworten:

174

Ich habe dieses Problem gelöst, indem ich die folgende Codierung hinzugefügt habe GalleryActivity.

ActionBar actionBar;
actionBar=getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

@Override
public boolean onOptionsItemSelected(MenuItem item) { 
        switch (item.getItemId()) {
        case android.R.id.home: 
            onBackPressed();
            return true;
        }

    return super.onOptionsItemSelected(item);
}

In der Hauptaktivität :

Vorher,

public class HomeActivity erweitert BaseActivity

Dann wechsle ich in

public class HomeActivity erweitert FragmentActivity

In GalleryFragment:

Ich Intentgebe es an die weiter GalleryActivity.

@Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        Gallery gallery = (Gallery) arg0.getAdapter().getItem(arg2);

        Intent intent = new Intent(getActivity(), GalleryActivity.class);
        intent.putExtra("position", position);
        intent.putExtra("id", gallery.getGalId());
        intent.putExtra("name", gallery.getAlbumTitle());
        startActivity(intent);

        // mCallback.OnGalItemSelected(gallery.getGalId(),gallery.getAlbumTitle());
    } 
Steve
quelle
1
Genau richtig! onBackPressedist genau das, wonach ich gesucht habe. Einer meiner Einstellungsbildschirme wurde von mehreren Bildschirmen aus geöffnet, und ich wollte zu derselben Aktivität zurückkehren, mit der er geöffnet wurde. Was ist diese spezielle ID android.R.id.homeim Zusammenhang mit Android-Aktivitäten?
RBT
@RBT Navigieren Sie zur übergeordneten Aktivität ( developer.android.com/training/implementing-navigation/… ). Bitte lesen Sie das.
Steve
Die Verwendung der onBackPressedHome-Aktion Ihres Optionsmenüs wird nicht empfohlen: Mit der Aufwärts-Schaltfläche (Zurück-Pfeil in der oberen linken Ecke) können Sie innerhalb einer App basierend auf den hierarchischen Beziehungen zwischen den Bildschirmen navigieren. Mit der System-Zurück-Schaltfläche können Sie in umgekehrter chronologischer Reihenfolge navigieren In der Geschichte der Bildschirme hat der Benutzer kürzlich gearbeitet. Weitere
Mike
39

Bitte lesen Sie dies

Sie sollten so etwas haben:

    <activity
        android:name="com.sit.fth.activity.HomeActivity"
        android:screenOrientation="portrait">

    </activity>
    <activity
        android:name="com.sit.fth.activity.GalleryActivity"
        android:screenOrientation="portrait"
        android:parentActivityName="com.sit.fth.activity.HomeActivity">

    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.sit.fth.activity.HomeActivity"/>

   </activity>


Wenn Sie dann NavUtils.navigateUpFromSameTask (dies) aufrufen, navigieren Sie zur übergeordneten Aktivität (HomeActivity).

x90
quelle
@ Stephen Leerlauf wo? Und ich verstehe immer noch nicht, von welcher Aktivität zu welcher Aktivität Sie navigieren möchten.
x90
Gallery Detail Fragmentzu Gallery Activity.Ich habe auch im Bild gezeigt
Steve
@ Stephen In welcher Aktivität GalleryDetailFragmentwird gehostet?
x90
@ Stephen Ich verstehe. Aber jedes Fragment sollte gehostet / angehängt / verbunden / zu Aktivität gehören. Ich frage, welche Aktivität zu Ihrem Fragment gehört.
x90
33

Sie müssen anrufen die Methode setDisplayHomeAsUpEnabled (true) in der Methode onCreate aufrufen, onSupportNavigateUp () überschreiben und darin onBackPressed () wie folgt aufrufen . Das ist es. erledigt :)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_help);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
Chanaka Fernando
quelle
Warum? Ich habe es getestet und nur android: parentActivityName = ". Activities.MainActivity" zum Manifest hinzugefügt, und es war genug mit diesem einen Gerät, mit dem ich es getestet habe.
David
Obwohl dies funktioniert, überprüfen Sie bitte noch einmal, ob Sie die android:parentActivityNameEinstellungen für Ihre Aktivität vorgenommen haben, bevor Sie manuell anrufen onBackPressed. Siehe stackoverflow.com/a/24033351/1563833
Wyck,
13

Sie müssen nur die folgende Zeile zur Aktivität in der Datei manifest.xml hinzufügen. Die übergeordnete Aktivität ist die Aktivität, zu der Sie zurückkehren möchten.

    android:parentActivityName=".activities.MainActivity"
Wissenschaftler
quelle
10

Versuchen Sie es wie

Zunächst müssen Sie addToBackStack()zuvor commit()für Fragmente verwenden

@Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
         // Respond to the action bar's Up/Home button
         case android.R.id.home:
             if(getSupportFragmentManager().getBackStackEntryCount()>0)
                getSupportFragmentManager().popBackStack();
             return true;
         }
         return super.onOptionsItemSelected(item);
     } 
Amit Gupta
quelle
3
Was ist das, kannst du erklären?
Wang'l Pakhrin
4

Die beste und einfachste Antwort ist das Hinzufügen des übergeordneten Aktivitätsnamens in der Manifestdatei, damit die Zurückschaltfläche der Aktionsleiste funktioniert.

Verwenden Sie dazu unter dem Activity-Tag der Manifest-Datei android:parentActivityName=".MyCustomParentActivity"

Vaishakh
quelle
1

Keine der hier gegebenen Antworten hat bei mir funktioniert. Ich musste das switchin die onMenuItemSelectedMethode einbauen. Ich bin mir bewusst, dass dies nicht in der Android-Dokumentation angegeben ist, aber es hat trotzdem funktioniert. Deshalb dachte ich nur, ich würde dies hier für Leute belassen, die auf dasselbe Problem stoßen. Mein Problem war ein Activitystatt eines Fragment, aber das sollte ziemlich gleich sein.

class FooActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // ...

        getActionBar().setHomeButtonEnabled(true);
        getActionBar().setDisplayHomeAsUpEnabled(true);
    }

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }

        return false;
    }
}
PLPeeter
quelle
1

Verwenden Sie die SupportNavigateUp()Methode on und rufen Sie onBackPresseddiese Methode auf.

Raj Godara
quelle
1

wenn die Home-Taste angezeigt wird. Sie sollten der Home-Schaltfläche über onOptionItemSelected fun eine Aktion hinzufügen (Pfeil in Ihrem Fall). Standardmäßig gibt es keine Aktion. Es ist also völlig normal, dass es nicht funktioniert. Bitte fügen Sie diesen Spaß zu Ihrer Aktivität hinzu:

 override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when {
            item.itemId == android.R.id.home -> {
                finish()
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }
Brahem Mohamed
quelle
0

Für mich musste ich mich mDrawerToggle.setToolbarNavigationClickListener(...)auf einen Listener einstellen , der die Back-Aktion auslöst. Sonst macht es nichts. So ActionBarDrawerTogglesieht der Quellcode von aus:

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    if (mDrawerIndicatorEnabled) {
      toggle();
    } else if (mToolbarNavigationClickListener != null) {
      mToolbarNavigationClickListener.onClick(v);
    }
  }
});

Das Standardverhalten ist also, unseren Hörer anzurufen und keine Magie alleine zu machen.

daniel.gindi
quelle
0

onCreate

{
    ...
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            resetActionBar();
    ...
 }


public void resetActionBar()
    {
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);
    }

 @Override
          public void onBackPressed() {
            FragmentManager fm = getSupportFragmentManager();
            int count = fm.getBackStackEntryCount();
            if(count == 0) {
                // Do you want to close app?
                showDialog();
            }else{
                super.onBackPressed();
            }
        }


    @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();
            Log.i("coming", "comming");
            //noinspection SimplifiableIfStatement
            if(id==android.R.id.home){
                if (getSupportFragmentManager().getBackStackEntryCount() > 0)
                    onBackPressed();
                else
                    drawerLayout.openDrawer(navigationView);
                return  true;
            }

            return super.onOptionsItemSelected(item);
        }
Hamza Mehmood
quelle
0

Hier ist noch eine Sache zu überprüfen, falls die anderen Antworten hier (oder hier oder hier oder hier ) nicht funktionieren.

Ich hatte Code aus einer anderen Aktivität kopiert, die das Menü deaktivierte. Durch Löschen dieser Methode (und Anwenden der in den anderen Antworten angegebenen Lösungen) konnte die Schaltfläche "Auf" funktionieren.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // hide the menu
    return false;
}
Suragch
quelle
0

In meinem Fall hatte ich die onCreateOptionsMenu-Methode überschrieben und am Ende vergessen, super aufzurufen.

Matt Mendrala
quelle