Autore Topic: Due activity con navigation drawer  (Letto 881 volte)

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Due activity con navigation drawer
« il: 29 Agosto 2014, 10:19:13 CEST »
0
Salve, ho creato un progetto col navigation drawer e compat action bar e creato questa classe principale:

Codice (Java): [Seleziona]
public class MainActivity extends ActionBarActivity implements
                NavigationDrawerFragment.NavigationDrawerCallbacks {

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

                mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager()
                                .findFragmentById(R.id.navigation_drawer);
               
                // Set up the drawer.
                mNavigationDrawerFragment.setUp(R.id.navigation_drawer,
                                (DrawerLayout) findViewById(R.id.drawer_layout));
}

public static class PlaceholderFragment extends Fragment {

// 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_main, container,false);

                return rootView;
               }

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

}

E questa è la layout principale:

Codice (XML): [Seleziona]
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/drawer_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="com.example.multirecipes.MainActivity" >

    <FrameLayout
       android:id="@+id/container"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />

    <fragment
       android:id="@+id/navigation_drawer"
       android:name="com.example.multirecipes.NavigationDrawerFragment"
       android:layout_width="@dimen/navigation_drawer_width"
       android:layout_height="match_parent"
       android:layout_gravity="start"
       tools:layout="@layout/fragment_navigation_drawer" />

</android.support.v4.widget.DrawerLayout>

E poi ho creato un altra layout che è contenuta dentro la layout principale, e fino a qui funziona perfettamente.
Ma adesso io avrei bisogno di creare un altra activity, con annesso navigation drawer, esattamente come ho creato l'activity, però ho bisogno di lanciarla dall'activity principale.

Quindi, come posso fare per creare e lanciare un altra "FragmentActivity" dalla "FragmentActivity" principale ?
Vincenzo Cimino @ Google Play Store


Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Due activity con navigation drawer
« Risposta #1 il: 29 Agosto 2014, 10:56:17 CEST »
0
guarda, mettiamo caso che adesso come seconda activity usiamo la stessa.

se fai context.startActivity(new Intent(context,StessaActivity.class)) vedrai che si rispre di nuovo tale activity.

Cosa altro ti serve?

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:Due activity con navigation drawer
« Risposta #2 il: 29 Agosto 2014, 11:18:56 CEST »
0
Allora, riformulo:
Adesso ho aggiunto alla MainActivity questo metodo:

Codice (Java): [Seleziona]
@Override
        public void onNavigationDrawerItemSelected(int position) {
                // update the main content by replacing fragments
                switch (position) {
        case 0: {
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager
                                .beginTransaction()
                                .replace(R.id.container,
                                                PlaceholderFragment.newInstance(position + 1)).commit();
            break;
        }
        case 1:{
            // if this position is to add fragment
            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager
                .beginTransaction()
                        .replace(R.id.container,
                                        SecondaActivity.PlaceholderFragment.newInstance(position + 1)).commit();
            break;
        }
        default:
                break;    
                }
        }

Con questo metodo all'avvio, viene mostrato correttamente la layout principale fragment_main richiamando il Placeholder di MainActivity. Poi ho creato un altra activity chiamata SecondaActivity, che come scritto nel metodo al case1 dovrebbe sostituire la layout già presente, ma quando lo faccio l'applicazione crasha e ottengo questi logcat:

08-29 11:17:09.403: E/AndroidRuntime(14976): FATAL EXCEPTION: main
08-29 11:17:09.403: E/AndroidRuntime(14976): java.lang.ClassCastException: com.example.multirecipes.MainActivity
08-29 11:17:09.403: E/AndroidRuntime(14976):    at com.example.multirecipes.BakingTinActivity$PlaceholderFragment.onAttach(BakingTinActivity.java:83)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:898)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1121)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at android.os.Handler.handleCallback(Handler.java:587)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at android.os.Handler.dispatchMessage(Handler.java:92)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at android.os.Looper.loop(Looper.java:130)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at android.app.ActivityThread.main(ActivityThread.java:3687)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at java.lang.reflect.Method.invokeNative(Native Method)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at java.lang.reflect.Method.invoke(Method.java:507)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
08-29 11:17:09.403: E/AndroidRuntime(14976):    at dalvik.system.NativeStart.main(Native Method)


Questo è il codice della SecondaActivity, che è pressocchè uguale a quello della MainActivity:
Codice (Java): [Seleziona]
public class SecondaActivity extends ActionBarActivity implements
                NavigationDrawerFragment.NavigationDrawerCallbacks {

        private static NavigationDrawerFragment mNavigationDrawerFragment;

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

                /* START setup drawer */               
                mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager()
                                .findFragmentById(R.id.navigation_drawer);
               
                // Set up the drawer.
                mNavigationDrawerFragment.setUp(R.id.navigation_drawer,
                                (DrawerLayout) findViewById(R.id.drawer_layout));
               
                /* END setup drawer */
        }
       
        @Override
        public void onNavigationDrawerItemSelected(int position) {
                // TODO Auto-generated method stub
               
        }
       
        public void onSectionAttached(int number) {
                switch (number) {
                case 1:
                        Toast.makeText(this, "First", Toast.LENGTH_SHORT).show();
                        break;
                case 2:
                        //startActivity(new Intent(this, BakingTinActivity.class));
                        Toast.makeText(this, "Second", Toast.LENGTH_SHORT).show();
                        break;
                case 3:
                        Toast.makeText(this, "Third", Toast.LENGTH_SHORT).show();
                        break;
                }
        }
       
        public static class PlaceholderFragment extends 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() {
                }
               
                /* START onCreateView() */
                @Override
                public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                Bundle savedInstanceState) {
                        /* START setting the layouts */
                        View rootView = inflater.inflate(R.layout.secondo_fragment container,false);
                        return rootView;
                }
               
                @Override
                public void onAttach(Activity activity) {
                        super.onAttach(activity);
                        ((SecondaActivity) activity).onSectionAttached(getArguments().getInt(
                                        ARG_SECTION_NUMBER));
                }      
               
        }
       
}
Vincenzo Cimino @ Google Play Store


Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Due activity con navigation drawer
« Risposta #3 il: 29 Agosto 2014, 12:22:30 CEST »
0
Fai ereditare entrambe le Activity da un'unica BaseActivity.

Offline Vincenzoz

  • Utente junior
  • **
  • Post: 122
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Play Store ID:
    Vincenzo Cimino
  • Sistema operativo:
    Windows 7
Re:Due activity con navigation drawer
« Risposta #4 il: 29 Agosto 2014, 12:36:03 CEST »
0
Ho più o meno risolto, scrivendo così nella prima activity:

Codice (Java): [Seleziona]
@Override
        public void onNavigationDrawerItemSelected(int position) {
                // update the main content by replacing fragments
                switch (position) {
        case 0: {
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager
                                .beginTransaction()
                                .replace(R.id.container,
                                                PlaceholderFragment.newInstance(position + 1)).commit();
            break;
        }
        case 1:{
                startActivity(new Intent(ctx,SecondaActivity.class));
            break;
        }
        default:
                break;    
                }
        }

e così nella secondaactivity:

Codice (Java): [Seleziona]
@Override
        public void onNavigationDrawerItemSelected(int position) {
                switch (position) {
        case 0: {
                startActivity(new Intent(this,MainActivity.class));            
            break;
        }
        case 1:{
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager
                                .beginTransaction()
                                .replace(R.id.container,
                                                PlaceholderFragment.newInstance(position + 1)).commit();
            break;
        }
        default:
                break;    
                }
        }

Ma adesso il problema è che quando apre la seconda activity, l'elemento selezionato nella classe del navigationdrawer è sempre 0 e quindi torna alla MainActivity. Come posso fare per non farlo tornare ?  :-o

Fai ereditare entrambe le Activity da un'unica BaseActivity.

Potresti farmi un esempio o postarmi una qualche guida?


P.S classe del navigation drawer:

Codice (Java): [Seleziona]
public class NavigationDrawerFragment extends Fragment {

        private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
        private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";

        private NavigationDrawerCallbacks mCallbacks;
        private ActionBarDrawerToggle mDrawerToggle;

        private DrawerLayout mDrawerLayout;
        private ListView mDrawerListView;
        private View mFragmentContainerView;
        private NavDrawerListAdapter adapter;
        private ArrayList<NavDrawerItem> navDrawerItems;
        private String[] navMenuTitles;
        private TypedArray navMenuIcons;

        private int mCurrentSelectedPosition = 0;
        private boolean mFromSavedInstanceState;
        private boolean mUserLearnedDrawer;

        public NavigationDrawerFragment() {
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                SharedPreferences sp = PreferenceManager
                                .getDefaultSharedPreferences(getActivity());
                mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);

                if (savedInstanceState != null) {
                        mCurrentSelectedPosition = savedInstanceState
                                        .getInt(STATE_SELECTED_POSITION);
                        mFromSavedInstanceState = true;
                }

                // Select either the default item (0) or the last selected item.
                if (savedInstanceState == null)
                        selectItem(mCurrentSelectedPosition);
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
                // Indicate that this fragment would like to influence the set of
                // actions in the action bar.
                setHasOptionsMenu(true);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                // load slide menu items
                navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
                // nav drawer icons from resources
                navMenuIcons = getResources().obtainTypedArray(R.array.nav_drawer_icons);
               
                mDrawerListView = (ListView) inflater.inflate(
                                R.layout.fragment_navigation_drawer, container, false);
               
                navDrawerItems = new ArrayList<NavDrawerItem>();
                // adding nav drawer items to array
                navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
                navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
                navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));    
                navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1)));    
               
                // Recycle the typed array
                navMenuIcons.recycle();
               
                mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
                                selectItem(position);
                        }
                });
               
                // setting the nav drawer list adapter
                adapter = new NavDrawerListAdapter(getActivity().getApplicationContext(),
                                navDrawerItems);
                mDrawerListView.setAdapter(adapter);
                mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
                return mDrawerListView;
        }

        public boolean isDrawerOpen() {
                return mDrawerLayout != null
                                && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
        }

        public void setUp(int fragmentId, DrawerLayout drawerLayout) {
                mFragmentContainerView = getActivity().findViewById(fragmentId);
                mDrawerLayout = drawerLayout;

                // set a custom shadow that overlays the main content when the drawer
                // opens
                mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
                                GravityCompat.START);
                // set up the drawer's list view with items and click listener

                ActionBar actionBar = getActionBar();
                actionBar.setDisplayHomeAsUpEnabled(true);
                actionBar.setHomeButtonEnabled(true);

                // ActionBarDrawerToggle ties together the the proper interactions
                // between the navigation drawer and the action bar app icon.
                mDrawerToggle = new ActionBarDrawerToggle(getActivity(), /* host Activity */
                mDrawerLayout, /* DrawerLayout object */
                R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
                R.string.navigation_drawer_open, /*
                                                                                 * "open drawer" description for
                                                                                 * accessibility
                                                                                 */

                R.string.navigation_drawer_close /*
                                                                                 * "close drawer" description for
                                                                                 * accessibility
                                                                                 */

                ) {
                        @Override
                        public void onDrawerClosed(View drawerView) {
                                super.onDrawerClosed(drawerView);
                                getActionBar().setTitle(R.string.app_name);
                                if (!isAdded()) {
                                        return;
                                }

                                getActivity().supportInvalidateOptionsMenu(); // calls
                                                                                                                                // onPrepareOptionsMenu()
                        }

                        @Override
                        public void onDrawerOpened(View drawerView) {
                                super.onDrawerOpened(drawerView);
                                getActionBar().setTitle("SlideMenu");
                                if (!isAdded()) {
                                        return;
                                }

                                if (!mUserLearnedDrawer) {
                                        // The user manually opened the drawer; store this flag to
                                        // prevent auto-showing
                                        // the navigation drawer automatically in the future.
                                        mUserLearnedDrawer = true;
                                        SharedPreferences sp = PreferenceManager
                                                        .getDefaultSharedPreferences(getActivity());
                                        sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true)
                                                        .commit();
                                }

                                getActivity().supportInvalidateOptionsMenu(); // calls
                                                                                                                                // onPrepareOptionsMenu()
                        }
                };

                if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
                        mDrawerLayout.openDrawer(mFragmentContainerView);
                }

                // Defer code dependent on restoration of previous instance state.
                mDrawerLayout.post(new Runnable() {
                        @Override
                        public void run() {
                                mDrawerToggle.syncState();
                        }
                });

                mDrawerLayout.setDrawerListener(mDrawerToggle);
        }

        private void selectItem(int position) {
                mCurrentSelectedPosition = position;
                if (mDrawerListView != null) {
                        mDrawerListView.setItemChecked(position, true);
                }
                if (mDrawerLayout != null) {
                        mDrawerLayout.closeDrawer(mFragmentContainerView);
                }
                if (mCallbacks != null) {
                        mCallbacks.onNavigationDrawerItemSelected(position);
                }
        }

        @Override
        public void onAttach(Activity activity) {
                super.onAttach(activity);
                try {
                        mCallbacks = (NavigationDrawerCallbacks) activity;
                } catch (ClassCastException e) {
                        throw new ClassCastException(
                                        "Activity must implement NavigationDrawerCallbacks.");
                }
        }

        @Override
        public void onDetach() {
                super.onDetach();
                mCallbacks = null;
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
                super.onSaveInstanceState(outState);
                outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
        }

        @Override
        public void onConfigurationChanged(Configuration newConfig) {
                super.onConfigurationChanged(newConfig);
                // Forward the new configuration the drawer toggle component.
                mDrawerToggle.onConfigurationChanged(newConfig);
        }

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

                return super.onOptionsItemSelected(item);
        }

        private ActionBar getActionBar() {
                return ((ActionBarActivity) getActivity()).getSupportActionBar();
        }

        public static interface NavigationDrawerCallbacks {

                void onNavigationDrawerItemSelected(int position);
        }
}
« Ultima modifica: 29 Agosto 2014, 12:43:45 CEST da Vincenzoz »
Vincenzo Cimino @ Google Play Store