setDisplayHomeAsUpEnabled(true)打开“选项”菜单

时间:2018-07-17 18:57:17

标签: android android-fragments android-actionbar back-stack fragment-backstack

我有一个片段MyProfile (包含有关已登录用户的信息),我想由片段Team使用(包含有关所有团队成员的信息)。当我将MyProfile用于Team片段时,我需要up按钮。我阅读了文档guide,尝试了up navigation inside fragment的全部知识,并在this example停了下来。

问题在于,我没有打开前一个片段,而是打开了选项菜单。

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
}

}

我尝试回到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);
    }
}

}

但是正如我已经说过的,它仅打开选项菜单。我在某个地方犯了概念错误吗?

更新onOptionsItemSelected内部存在问题。如果添加

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

然后单击后退箭头,Logcat中将没有任何内容。

1 个答案:

答案 0 :(得分:0)

根据您的代码,您已经为onOptionsItemSelected()处理了R.id.home,但是我看到您使用的是{strong> Android UI提供的ActionBar 后退按钮 本身

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

在这种情况下,主页按钮被称为android.R.id.home R.id.home

这就是您在Logcat中也无法获得任何更新的原因(如您在评论中所述)。

如下更新开关盒,并用R.id.home

替换 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);
}