【问题标题】: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 用于将数据传递给片段,你可以在其中显示等等。你能再次指出你的具体问题是什么吗?

标签: android android-fragments fragment navigation-drawer


【解决方案1】:

尝试检查这个答案..

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

https://stackoverflow.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
    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2021-04-24
    • 2018-01-16
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多