WedX - журнал о программировании и компьютерных науках

Конфликт между навигационным ящиком и правым боковым меню

Мне нужна ваша помощь. Делаю первые шаги в андроид программировании!

SOS!!!

Я создал классический навигационный ящик, который можно открыть/закрыть, щелкнув значок гамбургера или сдвинув с левой стороны. Я также создал правое боковое меню (как в приложении Facebook) и использовал эту библиотеку из GitHub (https://github.com/jfeinstein10/SlidingMenu). В конце у меня был конфликт между меню навигации ящика и правым боковым меню.

Когда открылось меню Navigation Drawer, и вы хотите закрыть его, сдвинув справа налево открытое правое боковое меню.

Итак, мой вопрос: как сказать устройству, что когда меню панели навигации открыто, вы не можете открыть правое боковое меню, сдвинув его, а сдвинув, вы можете просто закрыть панель навигации.

Мой код правого бокового меню в MainActivity:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

SlidingMenu menu = new SlidingMenu(this);
menu.setMode(SlidingMenu.RIGHT);
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
menu.setFadeDegree(0.35f);
menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);
menu.setMenu(R.layout.sidemenu);
menu.setBehindWidthRes(R.dimen.slidingmenu_behind_width);

String[] items = {"Fisrt fragment","Second fragment"};
((ListView) findViewById(R.id.sidemenu)).setAdapter(
        new ArrayAdapter<Object>(
                this,
                R.layout.sidemenu_item,
                R.id.text,
                items
        )
);

Код NavigationDrawer:

public class NavigationDrawerFragment extends Fragment {
public static final String PREF_FILE_NAME="testpref";
public static final String KEY_USER_LEARNED_DRAWER="user_learned_drawer";

private ActionBarDrawerToggle mDrawerToggle;
private ListView mDrawerList;
private DrawerLayout mDrawerLayout;

private boolean mUserLearnedDrawer;
private boolean mFromSavedInstanceState;

private View containerView;

public NavigationDrawerFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(),KEY_USER_LEARNED_DRAWER,"false"));
    if(savedInstanceState!=null){
        mFromSavedInstanceState=true;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_navigation_drawer, container, false);
}

public void setUp(int fragmentId, DrawerLayout drawerLayout, final Toolbar toolbar){
    containerView = getActivity().findViewById(fragmentId);
    mDrawerLayout = drawerLayout;
    mDrawerToggle = new ActionBarDrawerToggle(getActivity(),drawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close){

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            if(!mUserLearnedDrawer){
                mUserLearnedDrawer=true;
                saveToPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, mUserLearnedDrawer+"");
            }
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            getActivity().invalidateOptionsMenu();
        }

        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);

            if(slideOffset<0.6) {
                toolbar.setAlpha(1 - slideOffset);
            }
        }
    };
    if(!mUserLearnedDrawer&&!mFromSavedInstanceState){
        mDrawerLayout.openDrawer(containerView);
    }
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

}
public static void saveToPreferences(Context context,String preferenceName, String preferenceValue){
    SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(preferenceName, preferenceValue);
    editor.apply();
}
public static String readFromPreferences(Context context, String preferenceName, String defaultValue){
    SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_APPEND);
    return  sharedPreferences.getString(preferenceName, defaultValue);
}

Ответы:


1

Добавьте еще один уровень, например: https://pastebin.com/xm8UZbvj.

15.12.2014
  • А здесь только интерфейс. Мне нужно логическое решение. 15.12.2014
  • Есть ли у вас какие-либо идеи? 15.12.2014
  • Нет, потому что я не использую скользящее меню 15.12.2014

  • 2

    когда пользователь пытается открыть правое меню, проверьте, открыт ли ящик навигации, затем закройте его, используя код ниже:

    if(mDrawerLayout.isDrawerOpen(mDrawerList)){
            mDrawerLayout.closeDrawer(mDrawerList);
    }
    
    15.12.2014
  • так что, насколько я понимаю, если пользователи хотят сначала открыть правое боковое меню, им нужно закрыть навигационный ящик. Я создал свой навигационный ящик с помощью ActionBarDrawerToggle. В этом вашем коде что означает mDrawerList?! У меня ошибка в mDrawerList. Извините за такие глупые вопросы. Я только начинающий. 15.12.2014
  • если вы используете навигационный ящик, у вас должен быть список, который вы используете в своем навигационном ящике. Поэтому вам нужно передать объект этого представления списка. 15.12.2014
  • на самом деле я хочу использовать элементы GridView в своем навигационном ящике, но в любом случае я добавил частный ListView mDrawerList; так что теперь в коде нет ошибки, но приложение неt want to open in emulator. I donне понимает, что теперь делать. Можете ли вы взглянуть на код выше, который я добавил в сообщение. Код NavigationDrawer. Я добавил то, что вы сказали. Пожалуйста, мне нужен ваш профессиональный взгляд. Я буду ждать вашего скорого ответа. 15.12.2014
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]