10

我正在尝试在我的应用程序中使用滑动菜单。在我的 Sony Xperia S 上它工作得非常好,但是当我尝试在 HTC Desire HD 上启动应用程序时,菜单通过手势完美打开,但其他触摸事件被阻止并且顶部视图(ViewPager,滑动菜单在其后面)没有滚动。

有人知道如何解决这个问题吗?

给出答案可能会有所帮助(这就是我使用菜单的方式):

private void initSlidingMenu()  
{       
    mSlidingMenu = new SlidingMenu(getApplicationContext());

    mSlidingMenu.setMode(SlidingMenu.LEFT);
    mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
    mSlidingMenu.setShadowWidthRes(R.dimen.default_shadow_width);
    mSlidingMenu.setShadowDrawable(R.drawable.defaultshadow);
    mSlidingMenu.setBehindOffsetRes(R.dimen.default_behind_offset);
    mSlidingMenu.setFadeDegree(0.35f);
    mSlidingMenu.setMenu(firstPage);
    mSlidingMenu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);    
}

onPageSelected()中,我禁用或启用菜单,因此菜单仅出现在左侧页面:

@Override public void onPageSelected(int arg0)
{
    ActivityCompat.invalidateOptionsMenu(this);

    if (arg0 == Utils.DEFAULT_PAGE)

        mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);

    else

        mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
4

1 回答 1

9

我只是在运行 ICS 的三星 Galaxy S2 上运行良好的滑动菜单时遇到了同样的问题,但在运行 Gingerbread 的 HTC Desire 上却没有。

我使用与您相同的方法来实现滑动菜单,但我发现另一种实现解决了这个问题。

而不是手动将菜单附加到您的活动:

mSlidingMenu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);   

我选择通过 SlidingMenu 库中的一项滑动活动来扩展我的活动。就我而言,我的活动一开始是在扩展FragmentActivity,但我将其替换为SlidingFragmentActivity

然后你应该在方法中设置 behindViewonCreate否则你的活动会崩溃。

setBehindContentView(R.layout.slidingmenu); //Replace with the layout of your menu

它应该可以解决问题。

这是我的 Activity 的示例代码:

public class MainActivity extends SlidingFragmentActivity {

SlidingMenu menu;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Main view layout for the activity
    setContentView(R.layout.activity_listing); 

    // set the Behind View : REQUIRED (replace with your menu's layout)
    setBehindContentView(R.layout.slidingmenu);

    menu = getSlidingMenu();

    //Now you can customize your sliding menu if you want
    menu.setMode(SlidingMenu.LEFT);
    menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
    menu.setShadowWidthRes(R.dimen.shadow_width);
    menu.setShadowDrawable(R.drawable.slidingmenu_shadow);
    menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
    menu.setFadeDegree(0.35f);

您会注意到,使用此解决方案您无需致电

mSlidingMenu.setMenu(firstPage);
mSlidingMenu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);

我没有分析 SlidingMenu 库的所有源代码,但attachToActivity在某些情况下,当前方法可能存在错误,如果我们使用库提供的特殊活动,这些错误不会出现。

编辑:对于那些使用 SlidingMenu 库和 ActionBarSherlock (ABS) 的人来说还可以。首先,您必须确保在 SlidingMenu 库中引用了 ABS。这样,您就可以通过 ABS 扩展 SlidingMenu 提供的活动类。

例如,如果我想将 FragmentActivity 与 ABS 和滑动菜单一起使用:您必须在滑动菜单库中进行更改

class SlidingFragmentActivity extends FragmentActivity implements SlidingActivityBase

经过

class SlidingFragmentActivity extends SherlockFragmentActivity implements SlidingActivityBase

然后在您的应用程序中,SlidingFragmentActivity正常使用。

这是我的应用程序的代码,它就像我发布的一样,但支持 ABS:

public class MainActivity extends SlidingFragmentActivity {

ActionBar mActionBar;
SlidingMenu menu;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listing); //Layout of the above view

    /*
     * ABS initialization
     */
    mActionBar = getSupportActionBar();
    mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    mActionBar.setDisplayHomeAsUpEnabled(true);

    /*
     * Sliding menu initialization
     */
    menu = getSlidingMenu();
    menu.setMode(SlidingMenu.LEFT);
    menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
    menu.setShadowWidthRes(R.dimen.shadow_width);
    menu.setShadowDrawable(R.drawable.slidingmenu_shadow);
    menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
    menu.setFadeDegree(0.35f);

            /* This line initializes the way the sliding menu is working
            if you set the boolean to true, the ActionBar will slide along with the content.
            if you set to false, only the content will slide and the ActionBar will not move */
    setSlidingActionBarEnabled(true);

    // set the Behind View
    setBehindContentView(R.layout.slidingmenu); //Menu view
于 2012-12-16T01:43:42.363 回答