2

Здравствуйте!

Подскажите, пожалуйста, как правильно реализовать переключение фрагментов по нажатию на определенные пункты listview в navigation drawer.

Нажимаем в listview на первый пункт - отображается fragment1, нажимаем на второй пункт - отображается fragment2.

Насколько я понимаю, переключать фрагменты нужно в функции selectItem, но где их создавать и как правильно переключать?

Спасибо!

MainActivity.java

public class MainActivity extends Activity {
String[] mDrawerListNames = {"Fragment_1", "Fragment_2"};

private DrawerLayout mDrawerLayout;
private ListView mDrawerList;

private ActionBarDrawerToggle mDrawerToggle;

private CharSequence mDrawerTitle;
private CharSequence mTitle;

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

    mTitle = mDrawerTitle = getTitle();

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, mDrawerListNames);

    mDrawerList.setAdapter(adapter);

    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, 
            R.string.drawer_open, R.string.drawer_close) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return false;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    return super.onPrepareOptionsMenu(menu);
}

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

private void selectItem(int position) {

    mDrawerList.setItemChecked(position, true);
    setTitle(mDrawerListNames[position]);
    mDrawerLayout.closeDrawer(mDrawerList);
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
   mDrawerToggle.onConfigurationChanged(newConfig);
}
}

Fragment1.java

public class Fragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_1, container, false);
    }
}

Fragment2.java

public class Fragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_2, container, false);
    }
}
0

4 ответа 4

3

Я делаю так:

public static void commitFragment(Fragment fragment, FragmentManager fragmentManager) {
    fragmentManager.popBackStack();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); //добавляет fade
    fragmentTransaction.replace(R.id.fragmentLayout, fragment);
    fragmentTransaction.commit();
}

R.id.fragmentLayout - это id лэйаута в activity_main, в который встанет фрагмент

private void selectItem(int position) {

    ...

    switch(position){
      case 0:
      commitFragment(new Fragment1(), getFragmentManager());
      break;

      case 1:
      commitFragment(new Fragment2(), getFragmentManager());
      break;   
    }
}
2
  • Спасибо за ответ! У меня был похожий вариант реализации, но мне он показался неверным, ведь при каждом клике мы создаем новый экземпляр фрагмента. Не будет ли правильнее, если мы в onCreate MainActivity создадим фрагменты, а в selectItem будет переключать уже созданные ранее фрагменты?
    – Lems
    24 июл 2014 в 18:27
  • Почитайте [тут][1] коменты, умные люди имеют мнение [1]: hashcode.ru/questions/337488/…
    – katso
    25 июл 2014 в 2:37
0

Android Custom Navigation Drawer

0

В предыдущем проекте я вот такую реализацию использовал.

mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

                String[] rivers = getResources().getStringArray(R.array.Категории);

                mTitle = rivers[position];

                Fragment f;
                if (position == 0) {

                    f = new MyCompanyFragment();
                    FragmentManager fragmentManager = getSupportFragmentManager();
                    FragmentTransaction ft = fragmentManager.beginTransaction();
                    ft.replace(R.id.content_frame, f);

                    ft.commit();

                }
                if (position == 1) {

                    f = new MyEmployeeFragment();
                    FragmentManager fragmentManager = getSupportFragmentManager();
                    FragmentTransaction ft = fragmentManager.beginTransaction();
                    ft.replace(R.id.content_frame, f);

                    ft.commit();
                }

                if (position == 2) {
                    f = new CalendarFragment();
                    FragmentManager fragmentManager = getSupportFragmentManager();
                    FragmentTransaction ft = fragmentManager.beginTransaction();
                    ft.replace(R.id.content_frame, f);
                    ft.addToBackStack(null);
                    ft.commit();
                }
                if (position == 3) {
                    f = new SettingsFragment();
                    FragmentManager fragmentManager = getSupportFragmentManager();
                    FragmentTransaction ft = fragmentManager.beginTransaction();
                    ft.replace(R.id.content_frame, f);

                    ft.commit();
                }
                mDrawerLayout.closeDrawer(mDrawerList);

            }
        });
    }
0

На мой взгляд наиболее верным будет создание интерфейса описывающего по какому параметру происходит переключение между фрагментами ─ position в listview, _id в базе и тд.. реализация этого интерфейса в Activity,

extends ActionBarActivity implements Navigate {

Статистический метод для запуска фрагмента, (просто пример не привязан к конкретному случаю)

 public static MyFragment newInstance(long id) {
        Bundle arg = new Bundle();
        arg.putLong(ID, id);
        MyFragment fragment = new JobListFragment();
        fragment.setArguments(arg);
        return fragment;
    }

При создании фрагмента в onAttach проверить что Activity реализует интерфейс

 @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        try {
            mNavigate = (Navigate) activity;

        } catch (ClassCastException e) {
            throw new ClassCastException("Activity must implement Navigate.");
        }
    }

И вызывать методы интерфейса из фрагмента, это актуально не только для Navigation Drawer

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.