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。因此getActivityreturnsnull.

我不明白你为什么一开始就想乱用这个方法。您只需修改 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) {

    }
}