getActivity().getActionBar() 在第一个片段崩溃时
getActivity().getActionBar() on first fragment crash
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupViewPager();
}
private void setupViewPager() {
// TODO Auto-generated method stub
FragmentPagerItemAdapter adapter = new FragmentPagerItemAdapter(
getSupportFragmentManager(), FragmentPagerItems.with(this)
.add("Home", HomeFragment.class)
.add("Message", MessageFragment.class)
.add("My", MyFragment.class).create());
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
SmartTabLayout viewPagerTab = (SmartTabLayout) findViewById(R.id.viewpagertab);
final LayoutInflater inflater = LayoutInflater.from(viewPagerTab.getContext());
final Resources res = viewPagerTab.getContext().getResources();
viewPagerTab.setCustomTabView(new SmartTabLayout.TabProvider() {
@Override
public View createTabView(ViewGroup container, int position,PagerAdapter adapter) {
ImageView icon = (ImageView) inflater.inflate(R.layout.mainactivity_tab, container, false);
switch (position) {
case 0:
icon.setImageDrawable(res.getDrawable(R.drawable.mainactivity_tab_icon_home));
break;
case 1:
icon.setImageDrawable(res.getDrawable(R.drawable.mainactivity_tab_icon_message));
break;
case 2:
icon.setImageDrawable(res.getDrawable(R.drawable.mainactivity_tab_icon_my));
break;
default:
throw new IllegalStateException("Invalid position: "+ position);
}
return icon;
}
});
viewPagerTab.setViewPager(viewPager);
}
这是那三个片段中的代码
public class HomeFragment extends Fragment {
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_home, container, false);
TextView title = (TextView) rootView.findViewById(R.id.item_title);
title.setText("Home");
return rootView;
}
@Override
public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (visible) {
Log.d("Action bar", "Home");
ActionBar mActionBar= getActivity().getActionBar();
mActionBar.setDisplayShowHomeEnabled(true);
mActionBar.setDisplayShowTitleEnabled(false);
LayoutInflater mInflater = LayoutInflater.from(getActivity());
View mCustomView = mInflater.inflate(R.layout.actionbar_message, null);
mActionBar.setCustomView(mCustomView);
mActionBar.setDisplayShowCustomEnabled(true);
TextView title = (TextView) mCustomView.findViewById(R.id.actionbar_message_title);
title.setText("Home action bar");
}
}
他们在 MessageFragment.class 和 MyFragment 上工作,但不在 HomeFragment 上工作。
它会崩溃,ActionBar mActionBar = getActivity().getActionBar();
会 return null
和崩溃。
为什么它只适用于 MessageFragment 和 MyFragment?
HomeFragment 是第一个要显示的片段。
我的想法:我会在不同的片段上使用不同的自定义操作栏。
替换此行
ActionBar mActionBar = getActivity().getActionBar();
通过这个
ActionBar mActionBar=((ActionBarActivity) getActivity()).getSupportActionBar();
因为你延长了ActionBarActivity
问题是调用 setMenuVisibility
时您的片段没有附加到 activity。因此getActivity
returnsnull
.
我不明白你为什么一开始就想乱用这个方法。您只需修改 onCreateView
:
中的操作栏
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_home, container, false);
{
TextView title = (TextView) rootView.findViewById(R.id.item_title);
title.setText("Home");
}
ActionBar mActionBar= getActivity().getActionBar();
mActionBar.setDisplayShowHomeEnabled(true);
mActionBar.setDisplayShowTitleEnabled(false);
LayoutInflater mInflater = LayoutInflater.from(getActivity());
View mCustomView = mInflater.inflate(R.layout.actionbar_message, null);
mActionBar.setCustomView(mCustomView);
mActionBar.setDisplayShowCustomEnabled(true);
TextView title = (TextView) mCustomView.findViewById(R.id.actionbar_message_title);
title.setText("Message action bar");
return rootView;
}
如果确实需要使用该方法,那么您可以尝试简单的空检查:
if (visible && getActivity() != null) {
我的解决方案,把我的代码放在 setUserVisibleHint
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
}
}
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setupViewPager();
}
private void setupViewPager() {
// TODO Auto-generated method stub
FragmentPagerItemAdapter adapter = new FragmentPagerItemAdapter(
getSupportFragmentManager(), FragmentPagerItems.with(this)
.add("Home", HomeFragment.class)
.add("Message", MessageFragment.class)
.add("My", MyFragment.class).create());
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(adapter);
SmartTabLayout viewPagerTab = (SmartTabLayout) findViewById(R.id.viewpagertab);
final LayoutInflater inflater = LayoutInflater.from(viewPagerTab.getContext());
final Resources res = viewPagerTab.getContext().getResources();
viewPagerTab.setCustomTabView(new SmartTabLayout.TabProvider() {
@Override
public View createTabView(ViewGroup container, int position,PagerAdapter adapter) {
ImageView icon = (ImageView) inflater.inflate(R.layout.mainactivity_tab, container, false);
switch (position) {
case 0:
icon.setImageDrawable(res.getDrawable(R.drawable.mainactivity_tab_icon_home));
break;
case 1:
icon.setImageDrawable(res.getDrawable(R.drawable.mainactivity_tab_icon_message));
break;
case 2:
icon.setImageDrawable(res.getDrawable(R.drawable.mainactivity_tab_icon_my));
break;
default:
throw new IllegalStateException("Invalid position: "+ position);
}
return icon;
}
});
viewPagerTab.setViewPager(viewPager);
}
这是那三个片段中的代码
public class HomeFragment extends Fragment {
View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_home, container, false);
TextView title = (TextView) rootView.findViewById(R.id.item_title);
title.setText("Home");
return rootView;
}
@Override
public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (visible) {
Log.d("Action bar", "Home");
ActionBar mActionBar= getActivity().getActionBar();
mActionBar.setDisplayShowHomeEnabled(true);
mActionBar.setDisplayShowTitleEnabled(false);
LayoutInflater mInflater = LayoutInflater.from(getActivity());
View mCustomView = mInflater.inflate(R.layout.actionbar_message, null);
mActionBar.setCustomView(mCustomView);
mActionBar.setDisplayShowCustomEnabled(true);
TextView title = (TextView) mCustomView.findViewById(R.id.actionbar_message_title);
title.setText("Home action bar");
}
}
他们在 MessageFragment.class 和 MyFragment 上工作,但不在 HomeFragment 上工作。
它会崩溃,ActionBar mActionBar = getActivity().getActionBar();
会 return null
和崩溃。
为什么它只适用于 MessageFragment 和 MyFragment?
HomeFragment 是第一个要显示的片段。
我的想法:我会在不同的片段上使用不同的自定义操作栏。
替换此行
ActionBar mActionBar = getActivity().getActionBar();
通过这个
ActionBar mActionBar=((ActionBarActivity) getActivity()).getSupportActionBar();
因为你延长了ActionBarActivity
问题是调用 setMenuVisibility
时您的片段没有附加到 activity。因此getActivity
returnsnull
.
我不明白你为什么一开始就想乱用这个方法。您只需修改 onCreateView
:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_home, container, false);
{
TextView title = (TextView) rootView.findViewById(R.id.item_title);
title.setText("Home");
}
ActionBar mActionBar= getActivity().getActionBar();
mActionBar.setDisplayShowHomeEnabled(true);
mActionBar.setDisplayShowTitleEnabled(false);
LayoutInflater mInflater = LayoutInflater.from(getActivity());
View mCustomView = mInflater.inflate(R.layout.actionbar_message, null);
mActionBar.setCustomView(mCustomView);
mActionBar.setDisplayShowCustomEnabled(true);
TextView title = (TextView) mCustomView.findViewById(R.id.actionbar_message_title);
title.setText("Message action bar");
return rootView;
}
如果确实需要使用该方法,那么您可以尝试简单的空检查:
if (visible && getActivity() != null) {
我的解决方案,把我的代码放在 setUserVisibleHint
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
}
}