0

我一直在按照本教程创建滑动菜单:

http://www.youtube.com/watch?v=LWTYQ2g597o

而且因为我使用的是 Sherlock,所以我不得不改变我的类声明:

public class BaseActivity extends SlidingFragmentActivity 

到以下:

public class RggarbActionBar extends SherlockFragmentActivity implements SlidingActivityBase 

现在,每当我使用 getSlidingMenu() 方法时,我都会收到 NullPointerException,该方法在我的类中保持为空并返回 null。

这是我的全班:

public class RggarbActionBar extends SherlockFragmentActivity implements SlidingActivityBase  {
    protected ListFragment listFragment;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        listFragment = new RggarbSlidingMenu();
        SlidingMenu slidingMenu = getSlidingMenu();
        slidingMenu.setShadowWidth(15);//outsource these
        slidingMenu.setBehindOffset(60);
        slidingMenu.setFadeDegree(0.35f);
        slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        MenuInflater inflater = getSupportMenuInflater();
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        ActionBar actionBar = getSherlock().getActionBar();
        actionBar.setBackgroundDrawable(new 
                   ColorDrawable(Color.parseColor("#680e96")));
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setDisplayShowTitleEnabled(false);
        actionBar.setDisplayUseLogoEnabled(false);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setIcon(R.drawable.logo_icon);
        inflater.inflate(R.menu.action_bar_items, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        if(itemId == android.R.id.home) {
            toggle();
            return true;
        }
        else if (itemId == R.id.abFeed) {
            Intent feed = new Intent(this, Home.class);
            startActivity(feed);
            return true;
        } else if (itemId == R.id.abNotifications) {
            Intent notifications = new Intent(this, Notifications.class);
            startActivity(notifications);
            return true;
        } else if (itemId == R.id.abAddNewItem) {
            Intent addNewItem = new Intent(this, ItemAdd.class);
            startActivity(addNewItem);
            return true;
        } else if (itemId == R.id.abSearch) {
            Intent search = new Intent(this, SearchItems.class);
            startActivity(search);
            return true;
        } else {
            return onOptionsItemSelected(item); //watch out for this one. if any problems occur change to "return true"
        }
    }
    public class BasePagerAdapter extends FragmentPagerAdapter{
        private List<Fragment> mFragments = new ArrayList<Fragment>();
        private ViewPager mPager;

        public BasePagerAdapter(FragmentManager fm, ViewPager vp){
            super(fm);
            mPager = vp;
            mPager.setAdapter(this);
            for (int i = 0; i < 3; i++){
                addTab(new RggarbSlidingMenu());
            }
        }

        public void addTab(Fragment frag){
            mFragments.add(frag);
        }

        @Override
        public Fragment getItem(int position){
            return mFragments.get(position);
        }

        @Override
        public int getCount(){
            return mFragments.size();
        }
    }
    @Override
    public void setBehindContentView(View view, LayoutParams layoutParams) {
        // TODO Auto-generated method stub

    }

    @Override
    public void setBehindContentView(View view) {
        // TODO Auto-generated method stub

    }

    @Override
    public void setBehindContentView(int layoutResID) {
        // TODO Auto-generated method stub

    }

    @Override
    public SlidingMenu getSlidingMenu() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void toggle() {
        // TODO Auto-generated method stub

    }

    @Override
    public void showContent() {
        // TODO Auto-generated method stub

    }

    @Override
    public void showMenu() {
        // TODO Auto-generated method stub

    }

    @Override
    public void showSecondaryMenu() {
        // TODO Auto-generated method stub

    }

    @Override
    public void setSlidingActionBarEnabled(boolean slidingActionBarEnabled) {
        // TODO Auto-generated method stub

    }
}
4

1 回答 1

1

你的代码是

@Override
public SlidingMenu getSlidingMenu() {
    // TODO Auto-generated method stub
    return null;
}

您正在从此方法返回 null。您应该添加代码以返回您应该在其他地方创建的滑动菜单实例(很可能在您的活动的 OnCreate() 方法中)。

如果您返回 null,那正是您将得到的。

您最好遵循github 页面上的“简单示例SlidingActivityBase”而不是实现接口。

通过实现接口,您是说您想要处理滑动菜单系统的所有编码,并且不想使用内置代码。

实现接口(您正在做的事情)与扩展基类(您正在遵循的教程中解释的内容)完全不同。

您的选择是:

  1. 忘记您找到的教程,因为它不适用于您,并使用此处的说明手动实现您的滑动菜单。此方法不需要您扩展或实现任何东西,并且是更简单的选择。

  2. 您拥有ActionbarSherlockSlidingMenu的源代码。更改它,使 SlidingActivity 扩展 Sherlock Activity 而不是标准 Activity。

  3. 继续实现接口,但您必须为所有实现的方法编写代码。比听起来容易,因为您基本上可以在此处复制类中的代码,只需对类声明进行少量调整即可。

    public class SlidingActivity extends Activity implements SlidingActivityBase {
    

    改成

    public class SherlockSlidingActivity extends SherlockFragmentActivity implements SlidingActivityBase {
    
于 2013-10-13T15:14:38.973 回答