在导航抽屉中管理片段

Posted

技术标签:

【中文标题】在导航抽屉中管理片段【英文标题】:Managing Fragments in a navigation drawer 【发布时间】:2014-01-17 09:52:10 【问题描述】:

我从 http://javatechig.com/android/navigation-drawer-android-example 但我无法管理片段,或者更确切地说是屏幕上的主要内容。

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTitle = "Formulas";
    getActionBar().setTitle(mTitle);

    // Getting reference to the DrawerLayout
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    mDrawerList = (ListView) findViewById(R.id.drawer_list);

    // Getting reference to the ActionBarDrawerToggle
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open,
            R.string.drawer_close) 

        /** Called when drawer is closed */
        public void onDrawerClosed(View view) 
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu();

        

        /** Called when a drawer is opened */
        public void onDrawerOpened(View drawerView) 
            getActionBar().setTitle("Formulas");
            invalidateOptionsMenu();
        

    ;

    // Setting DrawerToggle on DrawerLayout
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    // Creating an ArrayAdapter to add items to the listview mDrawerList
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getBaseContext(), 
            R.layout.drawer_list_item, getResources().getStringArray(R.array.menus));

    // Setting the adapter on mDrawerList
    mDrawerList.setAdapter(adapter);

    // Enabling Home button
    getActionBar().setHomeButtonEnabled(true);

    // Enabling Up navigation
    getActionBar().setDisplayHomeAsUpEnabled(true);

    // Setting item click listener for the listview mDrawerList
    mDrawerList.setOnItemClickListener(new OnItemClickListener() 

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) 

            // Getting an array of rivers
            String[] menuItems = getResources().getStringArray(R.array.menus);

            // Currently selected river
            mTitle = menuItems[position];

            // Creating a fragment object
            WebViewFragment rFragment = new WebViewFragment();

            // Passing selected item information to fragment
            Bundle data = new Bundle();
            data.putInt("position", position);
            data.putString("url", getUrl(position));
            rFragment.setArguments(data);



            // Getting reference to the FragmentManager
            FragmentManager fragmentManager = getFragmentManager();

            // Creating a fragment transaction
            FragmentTransaction ft = fragmentManager.beginTransaction();

            // Adding a fragment to the fragment transaction
            ft.replace(R.id.content_frame, rFragment);

            // Committing the transaction
            ft.commit();

            // Closing the drawer
            mDrawerLayout.closeDrawer(mDrawerList);

        
    );





protected String getUrl(int position) 
    switch (position) 
    case 0:
        return "http://javatechig.com";
    case 1:
        return "http://javatechig.com/category/android/";
    case 2:
        return "http://javatechig.com/category/blackberry/";
    case 3:
        return "http://javatechig.com/category/j2me/";
    case 4:
        return "http://javatechig.com/category/sencha-touch/";
    case 5:
        return "http://javatechig.com/category/phonegap/";
    case 6:
        return "http://javatechig.com/category/java/";
    default:
        return "http://javatechig.com";
    

如何管理片段以便我可以: - 在项目中输入基本的 xml/java(所以我不必担心捆绑) 要么 - 替换当前片段,以便我可以创建自己的片段并自己自定义所有内容

【问题讨论】:

其实我不太确定你的问题是什么,Bundles 用于将数据传递给片段,你可以在其中显示等等。你能再次指出你的具体问题是什么吗? 【参考方案1】:

尝试检查这个答案..

它将帮助您以动态方式设置和使用导航抽屉...

https://***.com/a/34244065/2457493

希望这能满足您的查询..

【讨论】:

【参考方案2】:

我假设这是 SDK 附带的 Android 项目的示例代码。 您的示例实际上包含在 Activity 的内容窗格中交换片段所需的代码。

    // Getting reference to the FragmentManager
    FragmentManager fragmentManager = getFragmentManager();

    // Creating a fragment transaction
    FragmentTransaction ft = fragmentManager.beginTransaction();

    // Adding a fragment to the fragment transaction
    ft.replace(R.id.content_frame, rFragment);

    // Committing the transaction
    ft.commit();

您的rFragment 是要加载的片段。您可以将整个部分放在一个方法中,然后将要加载的片段作为该方法的参数传递,例如

private void replaceFragment(Fragment newFragment) 
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.replace(R.id.content_frame, newFragment);
    ft.commit();

如果要加载的 Fragment 需要将数据传递给它,则可以使用 Bundle。您的片段可能采用不同类型的数据,但上面的代码仍然适用。在 Fragment 对象上调用 setArguments() 后调用它。

【讨论】:

调用命令会是什么样子? replaceFragment(/*这里会写什么?*/); 你可以在需要的地方调用它。例如。您从 Activity 类中的数据库接收数据,并希望将其显示在新的 Fragment 中。您创建一个新的 Fragment(例如 DataTableFragment,在一个单独的类中的子类 Fragment),创建一个 Bundle,将一些参数放入其中,在新创建的 DataTableFragment 对象上调用 setArguments(Bundle...),然后读出 onCreateView 中的参数() 方法在您的 DataTableFragment 类等中。您可能想了解 Android 开发者网站上描述的基础知识:developer.android.com/guide/components/fragments.html

以上是关于在导航抽屉中管理片段的主要内容,如果未能解决你的问题,请参考以下文章

管理导航抽屉内片段中的线程(用于平滑动画)

导航抽屉的片段管理

导航抽屉异步任务

导航组件替换/更改后台堆栈

从片段中禁用导航抽屉

在导航抽屉片段中保存视图页面片段的状态