share
Stack Overflow на русскомКак прикрепить NavigationDrawer к нескольким активити?
[0] [2] Garf1eld
[2014-04-11 11:59:01]
[ actionbar android sdk ]
[ https://ru.stackoverflow.com/questions/311919/%d0%9a%d0%b0%d0%ba-%d0%bf%d1%80%d0%b8%d0%ba%d1%80%d0%b5%d0%bf%d0%b8%d1%82%d1%8c-navigationdrawer-%d0%ba-%d0%bd%d0%b5%d1%81%d0%ba%d0%be%d0%bb%d1%8c%d0%ba%d0%b8%d0%bc-%d0%b0%d0%ba%d1%82%d0%b8%d0%b2%d0%b8%d1%82%d0%b8 ]

Есть MainAсtivity, она содержит NavigationDrawer и ActionBar, у которого 4 кнопки, каждая кнопка вызывает свою активити и лэйаут соответственно. Как мне сделать так, чтобы каждая открытая из ActionBar, новая активити, содрежала в себе NavigationDrawer?

Код:

public class MainActivity extends ActionBarActivity {

    // Within which the entire activity is enclosed
      DrawerLayout mDrawerLayout;

    // ListView represents Navigation Drawer
     ListView mDrawerList;

    // ActionBarDrawerToggle indicates the presence of Navigation Drawer in the action bar
     ActionBarDrawerToggle mDrawerToggle;

    // Title of the action bar
     String mTitle="";

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    protected void onCreate(Bundle savedInstanceState) {

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

        mTitle = (String) getTitle();

        // 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,  /* nav drawer image to replace 'Up' caret */
                R.string.drawer_open,  /* "open drawer" description for accessibility */
                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("Мое меню");
                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.Категории)
        );

        // 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[] rivers = getResources().getStringArray(R.array.Категории);

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

                // Creating a fragment object
                Fragment f;
                if(position == 0){

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

                } if (position==1) {

                    f = new MyEmployeFragment();
                    FragmentManager fragmentManager = getFragmentManager();
                    FragmentTransaction ft = fragmentManager.beginTransaction();
                    ft.replace(R.id.content_frame, f);
                    ft.commit();
                }

                mDrawerLayout.closeDrawer(mDrawerList);

            }
        });
    }

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

    /** Handling the touch event of app icon */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent i;

        switch (item.getItemId()) {
            case R.id.action_one:
                Toast.makeText(this, "Раз",
                        Toast.LENGTH_SHORT).show();

                i=new Intent(MainActivity.this, OneTabActivity.class);
                startActivity(i);
                break;
            case R.id.action_two:
                Toast.makeText(this, "Два" ,
                        Toast.LENGTH_SHORT).show();

                i=new Intent(MainActivity.this, TwoTabActivity.class);
                startActivity(i);
                break;
            case R.id.action_three:
                Toast.makeText(this, "Три" ,
                        Toast.LENGTH_SHORT).show();

                i=new Intent(MainActivity.this, ThreeTabActivity.class);
                startActivity(i);
                break;
            case R.id.action_four:
                Toast.makeText(this, "Ну погоди!" ,
                        Toast.LENGTH_SHORT).show();

                i=new Intent(MainActivity.this, FourTabActivity.class);
                startActivity(i);
                break;

        }

        if (mDrawerToggle.onOptionsItemSelected(item)) {

            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /** Called whenever we call invalidateOptionsMenu() */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // If the drawer is open, hide action items related to the content view
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);

        menu.findItem(R.id.action_one).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

Код для активити которую нужно будет открыт из ActionBar

public class OneTabActivity extends ActionBarActivity {

    // ActionBarDrawerToggle indicates the presence of Navigation Drawer in the action bar
    public static ActionBarDrawerToggle mDrawerToggle;

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

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

    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @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.
        Intent i;

        switch (item.getItemId()) {
            case R.id.action_one:
                Toast.makeText(this, "Раз",
                        Toast.LENGTH_SHORT).show();

                i=new Intent(this, OneTabActivity.class);
                startActivity(i);
                break;
            case R.id.action_two:
                Toast.makeText(this, "Два" ,
                        Toast.LENGTH_SHORT).show();

                i=new Intent(this, TwoTabActivity.class);
                startActivity(i);
                break;
            case R.id.action_three:
                Toast.makeText(this, "Три" ,
                        Toast.LENGTH_SHORT).show();

                i=new Intent(this, ThreeTabActivity.class);
                startActivity(i);
                break;
            case R.id.action_four:
                Toast.makeText(this, "Ну погоди!" ,
                        Toast.LENGTH_SHORT).show();

                i=new Intent(this, FourTabActivity.class);
                startActivity(i);
                break;

        }
        return super.onOptionsItemSelected(item);
    }

}
[+4] [2014-04-15 11:03:09] Lucky_spirit [ACCEPTED]

Возможно, лучше сделать не Активити, а Фрагменты?


А в чем преимущество? Если взять тот же вКонтакт на андроиде, там как думаете одни фрагменты? - Garf1eld
(1) Фрагменты не могут быть лучше Активити только по той причине, что они не могут быть отображены без Активити. Просто Фрагмент - это возможность отделить отображение и некоторую логику контента от Context'а приложения. То есть Activity запущено и выполняет все функции Context'а. А Фрагмент в этот момент может быть отображён на экране или нет. Или несколько фрагментов сразу. Считайте это частным случаем MVC. P.S. я в 75% случаев получаю от ВК приложения NullPointerException после просмотра видео. Так что не думаю, что приложение ВК - действительно самый лучший способ для подражания. - Lucky_spirit
Опыта мало, не знаю когда лучше использовать фрагменты, а когда активити. Спасибо за ответ, я буду думать дальше) - Garf1eld
@Garf1eld, кстати, последний раз, когда у меня вылетело приложение ВК, я сделал скриншот деталей ошибки. Так вот там Вы можете легко увидеть ошибку во Фрагменте. Ссылка на скрин - shot.qip.ru/008BjO-6EBATV5H7 - Lucky_spirit
@Lucky_spirit спасибо! Как ни странно у меня не вылетает ВК - Garf1eld
@Garf1eld, а Вы попробуйте запустить видео в каком-нибудь сообществе, а потом много раз нажимать на Back, чтобы вернуться к корню приложения. У меня вылетает на странице списка моих групп. Именно там какой-то фильтр не успевает подгружаться и получаю NullPointerException - Lucky_spirit
@Lucky_spirit не обнаружил такого гоюка.. - Garf1eld
1
[-5] [2014-09-05 13:14:53] Andro

Про фрагменты это бред. в PlayMarkete есть 6 строк. по нажатии открывается новое активити и как раз таки это меню. Мне вот интеренестно. В PlayMarkete прикрепили как то NavigationDrawer и ActionBar ко всем активити. Или при создании активити создается еще и NavigationDrawer и ActionBar. Ну и из перевого активити передаются данные во второй, о нажатом меню из NavigationDrawer


2