Android Studio:如何在ActionBar中从片段实现后退按钮

时间:2019-08-01 19:40:16

标签: java android android-fragments android-actionbar

我无法在Fragment的ActionBar中实现后退按钮。由于这是一个片段,因此我无权访问getSupportActionBar();。并且每次我使用此代码或类似代码:

ActionBar actionBar = getActivity().getActionBar();
          actionBar.setDisplayHomeAsUpEnabled(true); 

仅导致NullPointerExceptions。

我在StackOverflow上查看了许多类似的问题,但大多数问题指定给活动 AppCompatActivities ,在片段中不起作用。使用

  

getActivity()。getActionBar()。setDisplayHomeAsUpEnabled(true);

仅导致NullPointerExceptions。其他类似的问题和答案并没有帮助我解决这个问题,因此我不得不创建一个新主题。

这是我得到错误的地方:

public class ExampleFragment extends Fragment{
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.clear();

        ActionBar actionBar = getActivity().getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true); //This results in NullPointerException

        inflater.inflate(R.menu.example_menu, menu);

        super.onCreateOptionsMenu(menu, inflater);
    }

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

2 个答案:

答案 0 :(得分:0)

您需要获得supportActionBar。

public class ExampleFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, 
                             @Nullable Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        ActionBar actionBar = ((AppCompatActivity)requireActivity()).getSupportActionBar();
        if (actionBar!=null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            requireActivity().getSupportFragmentManager().popBackStack();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

答案 1 :(得分:0)

我没有使它起作用,所以我更改了View的结构并将其更改为一个Activity,该Activity在处理此问题方面有更多支持。

@Override
    protected void onCreate(@Nullable Bundle savedInstance){
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == android.R.id.home) {
            finish();
        }

        return super.onOptionsItemSelected(item);
    }
相关问题