Change icone action back with Fragment

Asked

Viewed 755 times

5

Good morning, everyone,

I’m having trouble changing the action of the icon back <- on my Toolbar. I have two Fragments A and B being that B are details of A. inserir a descrição da imagem aqui - When I’m on Fragment B and I press <- I wanted to go to Fragment A. Currently it opens the Navigation Drawer.

BS.: I thought about rewriting the onBackPressed() method but as I am in a Fragment it is not possible.

Obs2.: When I press the physical boot back it calls Fragment A because I open Fragment B using stacking(code below)

 ft.replace(R.id.main_content, mFrag);
            ft.addToBackStack(null);
            ft.commit();

Follow Main Activity and Manifest code

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

private FragmentTransaction ft;

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

    //Fragment Iniciado com o app
    ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.main_content, new NoticiaFragment());
    toolbar.setTitle("NOTICIAS");
    ft.commit();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

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

    //noinspection SimplifiableIfStatement
    if (id == R.id.about) {
        ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.main_content, new SobreFragment());
        ft.commit();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.noticias) {
        //TODO acessar toolbar pelo fragment para alterar o titulo
        ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.main_content, new NoticiaFragment());
        ft.commit();
    } else if (id == R.id.sobre){
        ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.main_content, new SobreFragment());
        ft.commit();
    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
    }
}

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher_48dp"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">

    </activity>
    <activity
        android:theme="@style/FullscreenTheme"
        android:name=".Splash"
        android:screenOrientation="portrait"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

Thanks for your attention!!!

1 answer

1

To overwrite the action of Up Navigation in Fragment, you need to do some things:

First:

In the onCreateView from Fragment, declare this method:

setHasOptionsMenu(true); // Informa ao Android que este fragment contém menu próprio

After that, in this very Ragment, of @Override in the method onOptionsItemSelected:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
   int id = item.getItemId();
   if (id == android.R.id.home) { // Captura toques no Up Navigation
     // Faça a ação que você quiser
}

Once done, you can make Up Navigation behave specific to the relevant Fund.

EDIT:

I took a look at the code you added, try adding this method to onCreate of his MainActivity:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Do this after you have set the Toolbar.

  • Luiz did so but it didn’t work he keeps opening the navigation Drawer.

  • Edit your question then and post the Activity code where these Fragments are and also the manifest

  • OK Luiz already edited the question.

  • I edited the answer, also try to do what I put in Edit to see if the problem continues.

  • when I put this step code to have <-- on the main Activity and yet when I go to Fragment B it has the behavior of opening the Drawer navigation. To searching Fragment stack and the Drawer navigation of the standard api but still unsuccessful.

  • This is very strange, being that you remain in the same Activity when switching from Ragments and is still setting a different behavior for Up Navigation. If I think of anything, I’ll update it here.

  • I will use another Activity to detail for now is much simpler. thanks.

Show 2 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.