Android Studio:如何通过 Fragments 在 ActionBar 中实现后退按钮
Android Studio: How to implement backbutton in ActionBar from Fragments
我在片段的 ActionBar 中实现后退按钮时遇到问题。因为这是一个片段,所以我无权访问 getSupportActionBar();每次我使用这个或类似的代码时:
ActionBar actionBar = getActivity().getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
仅导致 NullPointerExceptions。
我在 Whosebug 上查看了许多类似的问题,但其中大部分都指定为 Activities 或 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);
}
}
您需要接收支持ActionBar。
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);
}
}
我没有让它工作,所以我更改了视图的结构并将其变为 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);
}
我在片段的 ActionBar 中实现后退按钮时遇到问题。因为这是一个片段,所以我无权访问 getSupportActionBar();每次我使用这个或类似的代码时:
ActionBar actionBar = getActivity().getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
仅导致 NullPointerExceptions。
我在 Whosebug 上查看了许多类似的问题,但其中大部分都指定为 Activities 或 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);
}
}
您需要接收支持ActionBar。
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);
}
}
我没有让它工作,所以我更改了视图的结构并将其变为 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);
}