代码之家  ›  专栏  ›  技术社区  ›  alawibh

实现LEFT_RIGHT滑动菜单时的奇怪行为

  •  3
  • alawibh  · 技术社区  · 11 年前

    亲爱的,

    我是安卓系统的新手,尝试在我的项目中使用SlidingMenu。 我想创建一个有两个与Facebook相同的滑动菜单的应用程序。

    通过这些步骤,我把我的申请放进了板条箱:

    1. 下载SlidingMenu库并将其添加到我的工作空间中。
    2. 下载并将actionbarsherlock库添加到我的工作空间。
    3. 在SlidingMenu库中,我添加了actionbarsherlock作为参考库。
    4. 在SlidingMenu库中,我扩展 SlidingActivity.java 使用actionbarsherlock: public class SlidingActivity extends SherlockActivity implements SlidingActivityBase
    5. 在我的应用程序中,我添加了对SlidingMenu库的引用。
    6. 在我的应用程序中,我扩展了我的主要活动以使用 SlidingActivity : public class MainMenu extends SlidingActivity

    我的主要活动代码:

    import android.app.ActionBar;
    import android.os.Bundle;
    import android.view.KeyEvent;
    
    import com.actionbarsherlock.view.MenuInflater;
    import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
    import com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity;
    
    public class MainMenu extends SlidingActivity {
        SlidingMenu  menu;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if (enableHomeIconActionBack() || enableHomeIconActionSlidingMenu()) {
                ActionBar actionBar = getActionBar();
                if (actionBar != null){
                    actionBar.setDisplayHomeAsUpEnabled(true);
                }
            }
    
            setContentView(R.layout.activity_main_menu);
            setBehindContentView(R.layout.activity_main_menu);
    
            menu = new SlidingMenu(this);
            menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
            menu.setMode(SlidingMenu.LEFT_RIGHT);
            menu.setShadowWidthRes(R.dimen.sliding_menu_shadow_width);
            menu.setShadowDrawable(R.drawable.shadow);
            menu.setBehindOffsetRes(R.dimen.sliding_menu_offset);
            menu.setFadeDegree(0.35f);
            menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);
            menu.setMenu(R.layout.sliding_menu_frame);
    
            menu.setSecondaryMenu(R.layout.vehicles_tree);
            menu.setSecondaryShadowDrawable(R.drawable.shadow);
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            MenuInflater inflater = getSupportMenuInflater();
            inflater.inflate(R.menu.main_menu, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
            switch (item.getItemId()) {
            case android.R.id.home:
                if (enableHomeIconActionSlidingMenu()
                        && menu != null) {
                    menu.toggle();
                } else if (enableHomeIconActionBack()) {
                    onCustomBackPressed();
                }
                return true;
            default:
                return super.onOptionsItemSelected(item);
            }
        }   
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                onCustomBackPressed();
                return true;
            default:
                return super.onKeyDown(keyCode, event);
            }
        }
    
        // If sliding menu is showing, we need to hide it on the first back button
        // press.
        private void onCustomBackPressed() {
            if (menu != null
                    && menu.isMenuShowing()) {
                menu.toggle();
            } else {
                this.onBackPressed();
            }
        }
    
        /**
         * Sets activity home icon to have up icon and on press act as device back
         * button press.
         * 
         * @return Activation state.
         */
        public boolean enableHomeIconActionBack() {
            return true;
        }
    
        /**
         * Sets activity home icon to be as a sliding menu invoke icon and on press
         * call toggle command for the sliding menu.
         * 
         * @return Activation state.
         */
        public boolean enableHomeIconActionSlidingMenu() {
            return true;
        }   
    }
    

    现在 menu.setMenu(R.layout.sliding_menu_frame); 将显示:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFFF00FF" >
    </RelativeLayout>
    

    menu.setSecondaryMenu(R.layout.vehicles_tree); 将显示:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:background="#FF0F00FF">
    </RelativeLayout>
    

    以下快照描述了这种奇怪的行为:

    Click to show image

    1. 主要活动。
    2. 当你滑动时 正确的 屏幕 .
    3. 当你滑动时 左边 屏幕 .
    4. 当你滑动时 正确的 从…起 屏幕左侧边缘 。此活动覆盖整个屏幕,显示附加到的活动 setBehindContentView(R.layout.activity_main_menu); ,我注意到,通过更改附加的布局。

    我不想要第四个屏幕,我做错了什么?

    当做 阿里·阿拉斯瓦德

    3 回复  |  直到 11 年前
        1
  •  1
  •   Captain overflow    11 年前

    更改此行

    public class MainMenu extends SlidingActivity {
    

    到这条线

    public class MainMenu extends Activity {
    

    SlidingActivity将带有“setBehindContentView”的行为编号4扩展到普通的android“活动”,因此将其改回android“活动“将删除不需要的行为

        2
  •  0
  •   Tushar    11 年前
    setBehindContentView(R.layout.activity_main_menu);
    

    这设置了主菜单的布局(向左滑动时会发生什么),因此您应该将其更改为使用 R.layout.sliding_menu_frame 并删除 setMenu(R.layout.sliding_menu_frame)

    我不知道为什么打电话 setMenu 并没有覆盖这一点,但它似乎并没有做到这一点。

        3
  •  0
  •   suraj jain    11 年前

    这里有一个Android库,允许您轻松创建带有滑入菜单的应用程序。你可以在你的Android应用程序中使用它,前提是你引用了这个项目并在你的应用程序中包含许可证。谢谢

    https://github.com/jfeinstein10/SlidingMenu