从活动类开放的Andr​​oid导航抽屉 [英] Open Android Navigation Drawer from an activity class

查看:193
本文介绍了从活动类开放的Andr​​oid导航抽屉的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的机器人抽屉式导航,并通过他们的文件看起来,抽屉只能扩展片段的活性,使从我的所有活动打开抽屉时,我需要让我的所有活动片段,这不是一个可行的解决方案。

有没有一种方法,我可以打开从活动延伸FragmentActivity抽屉里?

当我尝试从扩展Activity类我抽屉里的活动,另一项活动,将打开扩展draweractivity类(这里SlideMenuActivity)抽屉,应用程序崩溃给NullPointerException异常。

下面是code打开抽屉布局,但一旦第一个活动启动后,我无法访问抽屉。

应用是在syncState点轰然onPostCreate方法

  @覆盖
保护无效onPostCreate(捆绑savedInstanceState){
    // TODO自动生成方法存根
    super.onPostCreate(savedInstanceState);
    。getActionDrawerToggle()syncState();
}公共类SlideMenuActivity扩展FragmentActivity实现OnItemClickListener
{    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);
        setDrawerLayout();
        setDrawerList();
        如果(savedInstanceState == NULL)
        {
            getDrawerListView()setSelectionAfterHeaderView()。
            。getDrawerListView()setSelection(1);
            选择信息(1);
        }
    }
//
// @覆盖
//公共无效的setContentView(INT layoutResID){
// // TODO自动生成方法存根
// super.setContentView(layoutResID);
//}    私人DrawerLayout getDrawerView()
    {
        返回(DrawerLayout)findViewById(R.id.drawer_layout);
    }    私人的ListView getDrawerListView()
    {
        返回(ListView控件)findViewById(R.id.left_drawer);
    }    私人ActionBarDrawerToggle getActionDrawerToggle()
    {
        ActionBarDrawerToggle drawerToggle =新ActionBarDrawerToggle(
                对此,/ *主机活动* /
                getDrawerView(),/ * DrawerLayout对象* /
                R.drawable.ic_drawer,/ *导航抽屉图像替换上插入符* /
                R.string.drawer_open,/ *开放抽屉的描述可访问* /
                R.string.drawer_close / *关闭抽屉的描述可访问* /
                ){
            @覆盖
            公共无效onDrawerClosed(查看视图){
               super.onDrawerClosed(视图);
            }            @覆盖
            公共无效onDrawerOpened(查看视图){
                super.onDrawerOpened(视图);
            }
        };
        返回drawerToggle;
    }    私人无效setDrawerLayout(){
        //抽屉打开时设置覆盖的主要内容自定义阴影
        getDrawerView()setDrawerShadow(R.drawable.drawer_shadow,GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK)。
        //使动作条的应用程序图标表现为动作切换导航抽屉
        。getDrawerView()setDrawerListener(getActionDrawerToggle());    }    / **
     *设置抽屉的列表视图与项目,然后点击监听器
     * /
    私人无效setDrawerList()
    {
        ImageView的ImageView的=新ImageView的(本);
        imageView.setImageDrawable(getResources()getDrawable(R.drawable precision_logo));
        CustomBaseAdapter适配器=新CustomBaseAdapter();
        adapter.list = getListViewData();
        adapter.context =这一点;
        ListView控件drawerList = getDrawerListView();
        drawerList.setHeaderDividersEnabled(真);
        drawerList.addHeaderView(ImageView的,空,假);
        drawerList.setScrollingCacheEnabled(假);
        drawerList.setAdapter(适配器);
        drawerList.setOnItemClickListener(本);    }    私人无效选择信息(INT位置){         //更新替换片段的主要内容//片段片段= NULL;
// FragmentManager经理= getSupportFragmentManager();
        开关(位置){
        情况1:
            this.startActivity(新意图(这一点,SavedTankListActivity.class));
//片段=新SavedMixesFragment();
//片段=新SavedTankListActivity();
// manager.beginTransaction()取代(R.id.content_frame,片段).commit()。
            打破;        案例2:
//片段=新MixGuideFragment();
// manager.beginTransaction()取代(R.id.content_frame,片段).commit()。
            打破;        默认:
//片段=新SavedMixesFragment();
// manager.beginTransaction()取代(R.id.content_frame,片段).commit()。            打破;
        }        。getDrawerView()closeDrawer(getDrawerListView());    }    @覆盖
    保护无效onPostCreate(捆绑savedInstanceState){
        // TODO自动生成方法存根
        super.onPostCreate(savedInstanceState);
        。getActionDrawerToggle()syncState();
    }    @覆盖
    公共无效onConfigurationChanged(配置NEWCONFIG){
        // TODO自动生成方法存根
        super.onConfigurationChanged(NEWCONFIG);
        getActionDrawerToggle()onConfigurationChanged(NEWCONFIG)。
    }    私人的ArrayList< D​​rawerListModel> getListViewData()
    {
        ArrayList的< D​​rawerListModel> listViewData =新的ArrayList< D​​rawerListModel>();
        的String [] = listItemArray getResources()getStringArray(R.array.slide_bar_list_item_array)。
        对于(INT指数= 0;指数 - LT; listItemArray.length;指数++)
        {
            DrawerListModel模式=新DrawerListModel();
            model.listItem = listItemArray [指数]
            listViewData.add(模型);
        }
        返回listViewData;
    }    @覆盖
    公共无效onItemClick(适配器视图<>母公司,观景,INT位置,长的ID)
    {
        view.setSelected(真);
        选择信息(位置);
    }    公共无效openDrawerList(查看视图){
        。getDrawerView()openDrawer(getDrawerListView());
    }
}


解决方案

我也一直在寻找通过的文件,认为我有我的所有活动切换成片段。只需把它清除掉,这根本就不是这样的。你可以有很多元素的线性布局下或任何需要。

例如,如果没有appdrawer你的基本活动是:

 <&RelativeLayout的GT;
   <&TextView的GT;
   < / TextView的>
   <按钮和GT;
   <按钮和GT;
< / RelativeLayout的>

根本就

 < android.support.v4.widget.DrawerLayout>    <&RelativeLayout的GT;
       <&TextView的GT;
       < / TextView的>
       <按钮和GT;
       <按钮和GT;
    < / RelativeLayout的>    <&的ListView GT;
    < /&的ListView GT;
< /android.support.v4.widget.DrawerLayout>

I am working on android Navigation Drawer and through their documentation it looks like, the drawer can only extend Fragment Activity, so that to open drawer from all my activities, I need to make all my activities a fragment, which is not a feasible solution.

Is there a way I can open a drawer that extends FragmentActivity from an Activity?

When I try to extend my drawer activity from Activity class, and another activity that will open the drawer extending the draweractivity class (here SlideMenuActivity), the app crashes giving NullPointerException.

Below is the code for opening a drawer layout but once the first activity launches, I am unable to access the drawer.

App is crashing on syncState point in onPostCreate method

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onPostCreate(savedInstanceState);
    getActionDrawerToggle().syncState();
}

public class SlideMenuActivity extends FragmentActivity implements OnItemClickListener


{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setDrawerLayout();
        setDrawerList();
        if (savedInstanceState == null) 
        {
            getDrawerListView().setSelectionAfterHeaderView();
            getDrawerListView().setSelection(1);
            selectItem(1);
        }
    }
//  
//  @Override
//  public void setContentView(int layoutResID) {
//      // TODO Auto-generated method stub
//      super.setContentView(layoutResID);
//  }

    private DrawerLayout getDrawerView()
    {
        return (DrawerLayout)findViewById(R.id.drawer_layout);
    }

    private ListView getDrawerListView()
    {
        return (ListView) findViewById(R.id.left_drawer);
    }

    private ActionBarDrawerToggle getActionDrawerToggle()
    {
        ActionBarDrawerToggle drawerToggle=new ActionBarDrawerToggle(
                this,                  /* host Activity */
                getDrawerView(),         /* DrawerLayout object */
                R.drawable.ic_drawer,  /* nav drawer image to replace 'Up' caret */
                R.string.drawer_open,  /* "open drawer" description for accessibility */
                R.string.drawer_close  /* "close drawer" description for accessibility */
                ) {
            @Override
            public void onDrawerClosed(View view) {
               super.onDrawerClosed(view);
            }

            @Override
            public void onDrawerOpened(View view) {
                super.onDrawerOpened(view);
            }
        };
        return drawerToggle;
    }

    private void setDrawerLayout(){
        // set a custom shadow that overlays the main content when the drawer opens
        getDrawerView().setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.RELATIVE_HORIZONTAL_GRAVITY_MASK);
        // enable ActionBar app icon to behave as action to toggle navigation drawer
        getDrawerView().setDrawerListener(getActionDrawerToggle());

    }

    /**
     *  Set up the drawer's list view with items and click listener
     */
    private void setDrawerList()
    {
        ImageView imageView=new ImageView(this);
        imageView.setImageDrawable(getResources().getDrawable(R.drawable.precision_logo));
        CustomBaseAdapter adapter=new CustomBaseAdapter();
        adapter.list=getListViewData();
        adapter.context=this;
        ListView drawerList=getDrawerListView();
        drawerList.setHeaderDividersEnabled(true);
        drawerList.addHeaderView(imageView, null, false);
        drawerList.setScrollingCacheEnabled(false);
        drawerList.setAdapter(adapter);
        drawerList.setOnItemClickListener(this);

    }

    private void selectItem(int position){

         // update the main content by replacing fragments

//        Fragment fragment=null;
//      FragmentManager manager=getSupportFragmentManager();
        switch (position) {
        case 1:
            this.startActivity(new Intent(this,SavedTankListActivity.class));
//          fragment = new SavedMixesFragment();
//          fragment = new SavedTankListActivity();
//          manager.beginTransaction().replace(R.id.content_frame, fragment).commit();
            break;

        case 2:
//          fragment=new MixGuideFragment();
//          manager.beginTransaction().replace(R.id.content_frame, fragment).commit();
            break;

        default:
//          fragment = new SavedMixesFragment();
//          manager.beginTransaction().replace(R.id.content_frame, fragment).commit();

            break;
        }

        getDrawerView().closeDrawer(getDrawerListView());

    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onPostCreate(savedInstanceState);
        getActionDrawerToggle().syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
        getActionDrawerToggle().onConfigurationChanged(newConfig);
    }

    private ArrayList<DrawerListModel> getListViewData()
    {
        ArrayList<DrawerListModel> listViewData=new ArrayList<DrawerListModel>();
        String[] listItemArray=getResources().getStringArray(R.array.slide_bar_list_item_array);
        for(int index=0;index<listItemArray.length;index++)
        {
            DrawerListModel model=new DrawerListModel();
            model.listItem=listItemArray[index];
            listViewData.add(model);
        }
        return listViewData;
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,long id)
    {
        view.setSelected(true);
        selectItem(position); 
    }

    public void openDrawerList(View view){
        getDrawerView().openDrawer(getDrawerListView());
    }
}

解决方案

I too was looking through the documentation and thought that I had to switch all my activities into fragments. Just to clear it up, this is simply not the case. You can have as many elements under the linear layout or whatever as needed.

For example if your base activity without the appdrawer is:

<RelativeLayout>
   <TextView>
   </TextView>
   <Button>
   <Button>
</RelativeLayout>

Simply do

<android.support.v4.widget.DrawerLayout>

    <RelativeLayout>
       <TextView>
       </TextView>
       <Button>
       <Button>
    </RelativeLayout>

    <ListView>
    </ListView>
</android.support.v4.widget.DrawerLayout>

这篇关于从活动类开放的Andr​​oid导航抽屉的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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