Virtual Device
Virtual Device

Reputation: 2050

setDisplayHomeAsUpEnabled(true) opens Options Menu

I have a fragment MyProfile (consists info about a logged user) which I want to be used by fragments Team (consists info about all team members). When I use MyProfile for Team fragment, I need up button. I read documentation guide, tried all from up navigation inside fragment and stopped on this example.

The problem is instead of going back to the previous fragment in my case it just opens the options menu.

MainActivity

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    int id = item.getItemId();

    if (id == R.id.nav_team) {
        fragmentTransaction.replace(R.id.container, new TeamFragment())
                .addToBackStack(null)
                .commit();
    }

TeamFragment

public class TeamFragment extends Fragment {

private String LOG_TAG = getClass().getSimpleName();
private ListView teamList;
private android.support.v4.app.FragmentManager fragmentManager;

public TeamFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    fragmentManager = getFragmentManager();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    ((MainActivity) getActivity()).setActionBarTitle("Team");

    View rootView = inflater.inflate(R.layout.fragment_announcement, container, false);
    final SwipeRefreshLayout swipeToUpdate = rootView.findViewById(R.id.swiperefresh);

    teamList = rootView.findViewById(R.id.announcements_list);
    getTeamFromAPI(Contract.TEAM);

    teamList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ImageView avatar = view.findViewById(R.id.team_img);
            TextView fullname = view.findViewById(R.id.team_fullname);
            TextView jobtitle = view.findViewById(R.id.team_jobtitle);
            TextView email = view.findViewById(R.id.team_email);

            avatar.buildDrawingCache();
            Bitmap bitmap = avatar.getDrawingCache();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
            byte[] bAvatar = baos.toByteArray();
             //when team member i replace here current fragment with profile fragment
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            Fragment fragment = ProfileFragment.newInstance(String.valueOf(fullname.getText()),
                    String.valueOf(jobtitle.getText()),
                    String.valueOf(email.getText()), bAvatar);
            fragmentTransaction.replace(R.id.container, fragment, "MEMBER_PROFILE")
                    .addToBackStack(null)
                    .commit();
        }
    });
    return rootView;
}

private void getTeamFromAPI(String url) {
    //fetch team members from database
}

}

Place where I try return back to TeamFragment

ProfileFragment

    public class ProfileFragment extends Fragment{

private String LOG_TAG = getClass().getSimpleName();
private String mFullname;
private String mTitle;
private String mEmail;
private byte[] mAvatar;

private android.support.v4.app.FragmentManager fragmentManager;
private ActionBar actionBar;
private View rootView;

public ProfileFragment() {
    // Required empty public constructor
}

public static ProfileFragment newInstance(String name, String title, String email, byte[] avatar) {
    Bundle bundle = new Bundle();
    bundle.putString("fullname", name);
    bundle.putString("title", title);
    bundle.putString("email",email);
    bundle.putByteArray("avatar", avatar);

    ProfileFragment fragment = new ProfileFragment();
    fragment.setArguments(bundle);

    return fragment;
}

private void readBundle(Bundle bundle) {
    if (bundle != null) {
        this.mFullname = bundle.getString("fullname");
        this.mTitle = bundle.getString("title");
        this.mEmail = bundle.getString("email");
        this.mAvatar = bundle.getByteArray("avatar");
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    fragmentManager = getFragmentManager();

    // Sets "up navigation" for both phone/tablet configurations
    actionBar = ((MainActivity)getActivity()).getSupportActionBar();
    actionBar.setHomeButtonEnabled(true);
    actionBar.setDisplayHomeAsUpEnabled(true);
    setHasOptionsMenu(true);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    rootView = inflater.inflate(R.layout.fragment_announcement, container, false);
    ListView listView = rootView.findViewById(R.id.announcements_list);

    SwipeRefreshLayout swipe = rootView.findViewById(R.id.swiperefresh);
    swipe.setEnabled(false);


    readBundle(getArguments());
    ArrayList<ProfileObject> list = new ArrayList<>();
    list.add(new ProfileObject(mFullname, mTitle,mEmail,mAvatar));

    ProfileAdapter adapter = new ProfileAdapter(getContext(), list);
    listView.setAdapter(adapter);

    return rootView;
}

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

            Log.e(LOG_TAG+"/onOptionsItemSelected","Pressed: "+item.getItemId());
            android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            ProfileFragment member_profile = (ProfileFragment)fragmentManager.findFragmentByTag("MEMBER_PROFILE");
            fragmentTransaction.remove(member_profile).commit();
            fragmentManager.popBackStack();
            actionBar.setDisplayHomeAsUpEnabled(false);
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

}

But as I already said it only the opens options menu. Did I make a somewhere conceptual mistake?

UPDATE: Problem inside onOptionsItemSelected. If add

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Log.e(LOG_TAG+"/onOptionsItemSelected","Pressed: "+item.getItemId());
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

and click on back arrow nothing will be in Logcat.

Upvotes: 1

Views: 398

Answers (1)

adityakamble49
adityakamble49

Reputation: 2011

As per your code you have handled onOptionsItemSelected() for R.id.home but I see you are using ActionBar back button which is provided by Android UI itself

actionBar = ((MainActivity)getActivity()).getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

In this case Home Button is referenced as android.R.id.home and NOT R.id.home

This is the reason you are not getting any update in Logcat too (as you mentioned in comments).

Update your switch case as below and replace R.id.home with android.R.id.home

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home: // <- Update this

            android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            ProfileFragment member_profile = (ProfileFragment)fragmentManager.findFragmentByTag("MEMBER_PROFILE");
            fragmentTransaction.remove(member_profile).commit();
            fragmentManager.popBackStack();
            actionBar.setDisplayHomeAsUpEnabled(false);
            return true;

        default:
             return super.onOptionsItemSelected(item);
}

Upvotes: 1

Related Questions