导航抽屉Android的最佳实践 [英] Navigation Drawer Android best practice

查看:143
本文介绍了导航抽屉Android的最佳实践的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要寻找在Android的导航模式建议。在应用程序中我在工作的现状,我有一个抽屉式导航栏,可以访问大多是动态变化的一些元素。当我从抽屉式导航栏中单击一个项目我秀片段。所以,任何时候我想我回到左边的菜单。现在,我必须从图片移到新画面的活动,以相同的模式,有机会获得抽屉。得到的唯一方法新画面活动是从片段中的一个。

I am looking for advice on navigation pattern in android. In the current state of the app i am working at, I have a navigation drawer and can access some elements that are mostly dynamically changed. When I click an item from the navigation drawer I show a fragment. So anytime i want i go back to the left menu. Now, i have to move "New screen" activity from picture, in the same pattern, to have access to the drawer. The only way to get to "New screen" activity is from one of the fragments.

片段0具有的项目的列表。点击它它会打开新画面。我应该如何处理这个拥有本次活动的抽屉里呢?
我不希望有太多的锅炉code。
它已经在Android 4.2.2的问题,我只能现在想象这修改将如何影响性能。
我需要了解什么是最好的解决方案,与这个没有经验。我想要的是想法,也许得到此模式的一些诀窍,所以我不会导致内存泄漏和不重复code。

Fragment 0 has a list of items. Clicking on it it opens the "New screen". How should i approach this to have the drawer in this activity as well? I don't want to have too much boiler code. It already has problems on android 4.2.2, I can only imagine now how this modifications will affect performance. I need to understand what is best solution, have no experience with this. All I want is ideas and maybe get some know-how on this pattern so i don't cause memory leaks and don't duplicate code.

感谢您的时间。

在这里输入的形象描述

推荐答案

1,我会建议建立这将进一步扩展您的ActionBarActivity一个基本活动。

1-I would suggest to create a Base Activity which will further extends your ActionBarActivity.

此活动将2 activity_sliding_drawer布局文件包含main_container添加片段和DrawerLayout: -

2-activity_sliding_drawer layout file for this activity will contains a main_container for adding fragments and DrawerLayout:-

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/frame_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <FrameLayout
        android:layout_gravity="bottom"
        android:id="@+id/bottom_container"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:layout_width="match_parent"
        android:background="@color/white">
     </FrameLayout>
</FrameLayout>

<fragment
    android:id="@+id/slidingMenuFragment"
    android:name="om.ooredoo.fragments.SlidingMenuFragment"
    android:layout_width="@dimen/slidingmenu__parent_width"
    android:layout_height="fill_parent"
    android:layout_gravity="start" />

3然后基地内的活动,我们将对所有附加基本功能和替代碎片,还有2功能,将处理抽屉菜单图标,即 lockDrawerMenu()能见度&安培; unlockDrawerMenu()

3- Then inside base activity, we will have all basic functions for add and replace fragments and also 2 function which will handle visibility for drawer menu icon, i.e lockDrawerMenu() & unlockDrawerMenu().

4-将下面的code你的基地的活动(AbstractActivity在我的情况)内: -

4- Put the following code inside your base activity (AbstractActivity in my case):-

public abstract class AbstractActivity extends ActionBarActivity {
public DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private boolean bSupportActionBar = true;
private boolean mSlidingMenuLocked = false;
private BackPressListener mBackPressListener;
private String title;


boolean ismSlidingMenuLocked() {
    return mSlidingMenuLocked;
}


@Override
protected void onCreate(final Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    requestWindowFeature(Window.FEATURE_PROGRESS);
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_sliding_drawer);

    if (bSupportActionBar) {
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerLayout.setScrimColor(getResources().getColor(android.R.color.transparent));

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_navigation_drawer, //nav menu toggle icon
                R.string.drawer_open, // nav drawer open - description for accessibility
                R.string.drawer_close // nav drawer close - description for accessibility
        ) {

            public void onDrawerClosed(View view) {
                if (getSupportActionBar().getTitle().equals(getString(R.string.app_name)))
                    getSupportActionBar().setTitle(title);
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                title = (String) getSupportActionBar().getTitle();
                getSupportActionBar().setTitle(getString(R.string.app_name));

                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        unlockDrawerMenu();
    }
}

@Override
protected void onStart() {
    super.onStart();
    setSupportProgressBarIndeterminateVisibility(false);

}


@Override
protected void onDestroy() {
    super.onDestroy();
    if (mHandler != null) {
        mHandler.removeCallbacksAndMessages(null);
        mHandler = null;
    }
}


public void addNewFragmentWithBackStack(Fragment fragment) {
    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.frame_container, fragment, fragment.getClass().getSimpleName())
                .addToBackStack(fragment.getClass().getSimpleName())
                .commit();
    } else {
        Log.e("AbstractActivity", "Error in creating fragment");
    }
}

public void addNewFragmentWithBackStack(Fragment fragment, boolean animation) {
    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.slide_up_anim, 0);
        fragmentTransaction.replace(R.id.frame_container, fragment, fragment.getClass().getSimpleName())
                .addToBackStack(fragment.getClass().getSimpleName())
                .commit();
    } else {
        Log.e("AbstractActivity", "Error in creating fragment");
    }
}

public void addNewBottomFragmentWithBackStack(Fragment fragment) {
    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.slide_up_anim, 0);
        fragmentTransaction.replace(R.id.bottom_container, fragment)
                .addToBackStack(fragment.getClass().getSimpleName())
                .commit();
    } else {
        Log.e("AbstractActivity", "Error in creating fragment");
    }
}






public void replaceAndClearBackStack(Fragment fragment) {
    //clear backStack
    FragmentManager fm = getSupportFragmentManager();
    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

    FragmentTransaction transaction = fm.beginTransaction();
    transaction.replace(R.id.frame_container, fragment)
            .addToBackStack(fragment.getClass().getSimpleName());
    transaction.commit();
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    if (bSupportActionBar)
        mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // Pass any configuration change to the drawer toggles
    if (bSupportActionBar)
        mDrawerToggle.onConfigurationChanged(newConfig);
}


public void lockDrawerMenu() {
    ((DrawerLayout) findViewById(R.id.drawer_layout)).setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
    if (bSupportActionBar) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        mDrawerToggle.setDrawerIndicatorEnabled(false);
    }
    mSlidingMenuLocked = true;


}

public void unlockDrawerMenu() {
    ((DrawerLayout) findViewById(R.id.drawer_layout)).setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
    mSlidingMenuLocked = false;
    mDrawerToggle.setDrawerIndicatorEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // toggle nav drawer on selecting action bar app icon/title
    if (!ismSlidingMenuLocked() && mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    // Handle action bar actions click
    switch (item.getItemId()) {
        case android.R.id.home:
            if (ismSlidingMenuLocked()) {
                onBackPressed();
                return true;
            }
            return true;
        default: {
            return super.onOptionsItemSelected(item);
        }
    }
}

public BackPressListener getBackPressListener() {
    return mBackPressListener;
}

public void setBackPressListener(BackPressListener mBackPressListener) {
    this.mBackPressListener = mBackPressListener;
}

@Override
public void onBackPressed() {
    if (getSupportFragmentManager().getFragments().size() > 0) {
        for (Fragment frag : getSupportFragmentManager().getFragments()) {
            if (frag != null && frag.isAdded() && frag instanceof AbstractParentFragment) {
                if (frag.getChildFragmentManager().getBackStackEntryCount() > 0) {
                    frag.getChildFragmentManager().popBackStack();
                    return;
                }
            }

        }
    }

    if (mBackPressListener != null) {
        if (mBackPressListener.onBackPress())
            return;
    } else {
        if (getSupportFragmentManager().getBackStackEntryCount() == 1) {
            this.finish();
            return;
        }

        super.onBackPressed();
    }
}

void supportActionBar(boolean support) {
    bSupportActionBar = support;
}}

5现在创建延伸你的基地活动滑动抽屉的活动,并启动你的主要片段这主要片段里面打开项目的其他片段基本在点击滑动抽屉。
现在你有两个函数来处理滑动抽屉,如果滑动抽屉图标是可见的,然后它工作在项目点击别人的基础知识,将与动作条正常的片段。

5- Now create a Sliding drawer activity which extends your base activity and launch your main fragment inside this main fragment open your other fragments basics of item clicked in sliding drawer. Now you have two function to handle sliding drawer if sliding drawer icon is visible then it works on the basics of item clicked else it will a normal fragment with action bar.

希望这会帮助你。 !

Hope this will help you. !!!

这篇关于导航抽屉Android的最佳实践的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆