Android的 - 如何改变片段在导航抽屉 [英] Android - How to change fragments in the Navigation Drawer

查看:108
本文介绍了Android的 - 如何改变片段在导航抽屉的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是相当新的Andr​​oid的编程,但一直在做pretty的很好,直到如今。我读过很多答案对这个问题,但似乎无法让我的工作。基本上,我已经是一个导航抽屉MainActivity。我有两个片段用正确的对应片段布局XMLS初始化。目前,我可以得到我的第一个片段显示应用程序启动时,当我点击在抽屉里的每个项目,标题更改;然而,该片段保持不变。有什么建议么?我认为是相关的code是如下(未显示对于NavigationDrawerFragment.java的code必要code自动Eclipse中建)。在此先感谢!

 公共类MainActivity扩展活动
实现NavigationDrawerFragment.NavigationDrawerCallbacks {

/ **
 *片段管理导航抽屉的行为,相互作用和presentation。
 * /
私人NavigationDrawerFragment mNavigationDrawerFragment;

/ **
 *用于存储最后屏幕标题。对于使用{@link #restoreActionBar()}。
 * /
私人的CharSequence mTitle;

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);

    mNavigationDrawerFragment =(NavigationDrawerFragment)
            。getFragmentManager()findFragmentById(R.id.navigation_drawer);
    mTitle =的getTitle();

    //设置抽屉。
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout)findViewById(R.id.drawer_layout));


}

@覆盖
公共无效onNavigationDrawerItemSelected(INT位置){
    //更新替换片段的主要内容

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.content_frame,PlaceholderFragment.newInstance(位置+ 1))
            。承诺();

}

公共无效onSectionAttached(INT编号){
    开关(数){
        情况1:
            mTitle =的getString(R.string.title_home);
            打破;
        案例2:
            mTitle =的getString(R.string.title_infodirect);
            打破;
        案例3:
            mTitle =的getString(R.string.title_trailmap);
            打破;
        壳体4:
            mTitle =的getString(R.string.title_poi);
            打破;
        壳体5:
            mTitle =的getString(R.string.title_photomap);
            打破;
        情况6:
            mTitle =的getString(R.string.title_report);
            打破;
        案例7:
            mTitle =的getString(R.string.title_rulesreg);

    }
}

公共无效restoreActionBar(){
    动作条动作条= getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setDisplayShowTitleEnabled(真正的);
    actionBar.setTitle(mTitle);
}


@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
    如果(!mNavigationDrawerFragment.isDrawerOpen()){
        //只显示有关该屏幕中的操作栏项目
        //如果抽屉没有显示。否则,让抽屉
        //决定如何操作栏中显示。
        。getMenuInflater()膨胀(R.menu.overview,菜单);
        restoreActionBar();
        返回true;
    }
    返回super.onCreateOptionsMenu(菜单);
}

@覆盖
公共布尔onOptionsItemSelected(菜单项项){
    //处理动作栏项目点击这里。将操作栏
    //自动在主/向上按钮操作的点击,只要
    //你在AndroidManifest.xml中指定一个父活动。
    INT的id = item.getItemId();
    如果(ID == R.id.action_settings){
        返回true;
    }
    返回super.onOptionsItemSelected(项目);
}

/ **
 *包含一个简单的视图的占位符片段。
 * /
公共静态类PlaceholderFragment扩展片段{
    / **
     *片段参数重新presenting本章节号
     * 分段。
     * /
    私有静态最后弦乐ARG_SECTION_NUMBER =section_number标;

    / **
     *对于给定的部分中返回此片段的一个新实例
     * 数。
     * /
    公共静态PlaceholderFragment的newInstance(INT sectionNumber){
        PlaceholderFragment片段=新PlaceholderFragment();
        捆绑的args =新包();
        args.putInt(ARG_SECTION_NUMBER,sectionNumber);
        fragment.setArguments(参数);
        返回片段;
    }

    公共PlaceholderFragment(){
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        查看rootView = inflater.inflate(R.layout.fragment_home,集装箱,假);
        返回rootView;
    }

    @覆盖
    公共无效onAttach(活动活动){
        super.onAttach(活动);
        ((MainActivity)活动).onSectionAttached(
                。getArguments()调用getInt(ARG_SECTION_NUMBER));
    }
}

公共静态类InfoDirectFragment扩展片段{
    / **
     *片段参数重新presenting本章节号
     * 分段。
     * /
    私有静态最后弦乐ARG_SECTION_NUMBER =section_number标;

    / **
     *对于给定的部分中返回此片段的一个新实例
     * 数。
     * /
    公共静态InfoDirectFragment的newInstance(INT sectionNumber){
        InfoDirectFragment片段=新InfoDirectFragment();
        捆绑的args =新包();
        args.putInt(ARG_SECTION_NUMBER,sectionNumber);
        fragment.setArguments(参数);
        返回片段;
    }

    公共InfoDirectFragment(){
    }

    @覆盖
    公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,
            捆绑savedInstanceState){
        查看rootView = inflater.inflate(R.layout.fragment_infodirect,集装箱,假);
        返回rootView;
    }

    @覆盖
    公共无效onAttach(活动活动){
        super.onAttach(活动);
        ((MainActivity)活动).onSectionAttached(
                。getArguments()调用getInt(ARG_SECTION_NUMBER));
    }
}
}
 

解决方案

按照此的链接!! 的更多细节,并使用

 私有类DrawerItemClickListener工具
            ListView.OnItemClickListener {
        @覆盖
        公共无效onItemClick(适配器视图<>母公司视图中查看,INT位置,
                长ID){
            选择信息(位置);
        }
    }
 

 私人无效选择信息(INT位置){
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction英尺= fragmentManager.beginTransaction();


    开关(位置){

    情况下0:

        ft.replace(R.id.content_frame,新片段1,Constants.TAG_FRAGMENT).commit();

        打破;


    情况1:
        ft.replace(R.id.content_frame,新Fragment2,Constants.TAG_FRAGMENT);

        ft.commit();
        打破;

    }

    mDrawerList.setItemChecked(位置,真正的);
    的setTitle(标题[位置]);

    //关闭抽屉
    mDrawerLayout.closeDrawer(mDrawerList);
}
 

I'm fairly new to Android programming, but have been doing pretty well until now. I've read a lot of answers to this question but can't seem to make mine work. Basically what I have is a MainActivity with a Navigation Drawer. I have two fragments correctly initialized with corresponding fragment layout xmls. Currently I can get my first fragment to show up when the app starts and when I click on each item in the drawer, the titles change; however, the fragment stays the same. Any suggestions? What I believe to be relevant code is below (not shown is the code for the NavigationDrawerFragment.java with the necessary code automatically built by Eclipse). Thanks in advance!

public class MainActivity extends Activity
implements NavigationDrawerFragment.NavigationDrawerCallbacks {

/**
 * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
 */
private NavigationDrawerFragment mNavigationDrawerFragment;

/**
 * Used to store the last screen title. For use in {@link #restoreActionBar()}.
 */
private CharSequence mTitle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));


}

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction()
            .replace(R.id.content_frame, PlaceholderFragment.newInstance(position + 1))
            .commit();

}

public void onSectionAttached(int number) {
    switch (number) {
        case 1:
            mTitle = getString(R.string.title_home);
            break;
        case 2:
            mTitle = getString(R.string.title_infodirect);
            break;
        case 3:
            mTitle = getString(R.string.title_trailmap);
            break;
        case 4:
            mTitle = getString(R.string.title_poi);
            break;
        case 5:
            mTitle = getString(R.string.title_photomap);
            break;
        case 6:
            mTitle = getString(R.string.title_report);
            break;
        case 7:
            mTitle = getString(R.string.title_rulesreg);

    }
}

public void restoreActionBar() {
    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    actionBar.setDisplayShowTitleEnabled(true);
    actionBar.setTitle(mTitle);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    if (!mNavigationDrawerFragment.isDrawerOpen()) {
        // Only show items in the action bar relevant to this screen
        // if the drawer is not showing. Otherwise, let the drawer
        // decide what to show in the action bar.
        getMenuInflater().inflate(R.menu.overview, menu);
        restoreActionBar();
        return true;
    }
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_home, container, false);
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(
                getArguments().getInt(ARG_SECTION_NUMBER));
    }
}

public static class InfoDirectFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static InfoDirectFragment newInstance(int sectionNumber) {
        InfoDirectFragment fragment = new InfoDirectFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public InfoDirectFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_infodirect, container, false);
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(
                getArguments().getInt(ARG_SECTION_NUMBER));
    }
}
}

解决方案

Follow This link!! for more details and use

private class DrawerItemClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            selectItem(position);
        }
    }

and

private void selectItem(int position) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();


    switch (position) {

    case 0:

        ft.replace(R.id.content_frame, new Fragment1, Constants.TAG_FRAGMENT).commit();

        break;


    case 1:
        ft.replace(R.id.content_frame, new Fragment2, Constants.TAG_FRAGMENT);

        ft.commit();
        break;

    }

    mDrawerList.setItemChecked(position, true);
    setTitle(title[position]);

    // Close drawer
    mDrawerLayout.closeDrawer(mDrawerList);
}

这篇关于Android的 - 如何改变片段在导航抽屉的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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