如何在Android中保留抽屉的同时将其他活动传递给其他活动?

问题描述:

我目前正在使用该模板(使用导航抽屉)this site。然而,就像大多数导航抽屉一样,碎片用于保存抽屉物品。如何在Android中保留抽屉的同时将其他活动传递给其他活动?

我希望能够从activity> nav drawer> fragment>转到另一个活动,因为我想在该活动中包含Google地图。

为方便起见,此活动将被称为add_route_activity.xml。我想通过它的片段my_routes_fragment.xml我的问题是,我想要add_route_activity.xml也有导航的抽屉。

我的主要活动叫做activity_main.xml。有什么办法可以实现我想要的吗?我目前正在使用Android Studio。

无论如何,我尝试过的是用Material Design Template片段创建另一个活动(add_route_activity.xml),但是我的应用程序崩溃了。下面是我的一些代码:

MainActivity.java

package com.my.app; 

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 


public class MainActivity extends ActionBarActivity 
     implements NavigationDrawerCallbacks { 

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

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar); 
     setSupportActionBar(mToolbar); 

     mNavigationDrawerFragment = (NavigationDrawerFragment) 
       getFragmentManager().findFragmentById(R.id.fragment_drawer); 

     // Set up the drawer. 
     mNavigationDrawerFragment.setup(R.id.fragment_drawer, (DrawerLayout) findViewById(R.id.drawer), mToolbar); 
     // populate the navigation drawer 
     mNavigationDrawerFragment.setUserData("John Doe", "[email protected]", Bit 

     mapFactory.decodeResource(getResources(), R.drawable.avatar)); 
    } 

    @Override 
    public void onNavigationDrawerItemSelected(int position) { 
     // update the main content by replacing fragments 
     Toast.makeText(this, "Menu item selected -> " + position, Toast.LENGTH_SHORT).show(); 

     Fragment fragment = null; 

     switch (position) { 
      case 0: 
       fragment = new HomeFragment(); 
       break; 
      case 1: 
       fragment = new ProfileFragment(); 
       break; 
      case 2: 
       fragment = new ParkFragment(); 
       break; 
      case 3: 
       fragment = new MyGalleryFragment(); 
       break; 
      case 4: 
       fragment = new NavigationFragment(); 
       break; 
      case 5: 
       fragment = new MyEventsFragment(); 
       break; 
      case 6: 
       fragment = new MyActivitiesFragment(); 
       break; 
      case 7: 
       fragment = new MyRoutesFragment(); 
       break; 
      case 8: 
       fragment = new PlannerFragment(); 
       break; 
      case 9: 
       fragment = new SignInFragment(); 
       break; 
      case 10: 
       fragment = new SettingsFragment(); 
       break; 
      default: 
       break; 
     } 

     if (fragment != null) { 
      FragmentManager fragmentManager = getFragmentManager(); 
      fragmentManager.beginTransaction() 
        .replace(R.id.container, fragment).commit(); 

     } 
     else { 
      // error in creating fragment 
      Log.e("MainActivity", "Error in creating fragment"); 
     }  
    }  

    @Override 
    public void onBackPressed() { 
     if (mNavigationDrawerFragment.isDrawerOpen()) 
      mNavigationDrawerFragment.closeDrawer(); 
     else 
      super.onBackPressed(); 
    } 


    @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.main, menu); 
      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(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

MyRoutesFragment.java

package com.my.app; 

import android.app.Fragment; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

public class MyRoutesFragment extends Fragment { 

    public MyRoutesFragment() {} 

    Context context; 
    Button btnAddRoute; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_my_routes, container, false); 

     btnAddRoute = (Button) rootView.findViewById(R.id.btnAddRoute); 
     btnAddRoute.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Intent intent = new Intent(context, AddRouteActivity.class); 
       //startActivity(intent); 
      } 
     }); 


     return rootView; 
    } 
} 

具体而言,应用程序崩溃,当我尝试使用模板来运行AddRouteActivity(与导航抽屉)。基本上我想要做的是在AddRouteActivity上创建一个新的导航器抽屉,并使用相同的项目填充它,但那不起作用。

我们所做的是我们有一个自定义视图绑定到抽屉布局中的左侧抽屉。

public class LeftNavigationDrawerView 
     extends LinearLayout { 
    public static final String TAG = LeftNavigationDrawerView.class.getSimpleName(); 

    @Inject 
    LeftNavigationDrawerPresenter leftNavigationDrawerPresenter; 

    private DrawerLayout drawerLayout; 

    public LeftNavigationDrawerView(Context context) { 
     super(context); 
     init(); 
    } 

    public LeftNavigationDrawerView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    @TargetApi(11) 
    public LeftNavigationDrawerView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    @TargetApi(21) 
    public LeftNavigationDrawerView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(); 
    } 

    private void init() { 
    } 

    @OnClick(R.id.dashboard_drawer_tv_programs_ll) 
    public void onClickTvProgramsDrawerBtn() { 
     leftNavigationDrawerPresenter.startTVPrograms(); 
    } 

    @OnClick(R.id.dashboard_drawer_settings_ll) 
    public void onClickSettingsDrawerBtn() { 
     leftNavigationDrawerPresenter.startSettings(); 
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     this.drawerLayout = (DrawerLayout) getParent(); 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     ButterKnife.bind(this); 
     Injector.INSTANCE.getApplicationComponent().inject(this); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     ButterKnife.unbind(this); 
    } 
} 

而且它的XML布局

<com.acme.LeftNavigationDrawerView 
    android:id="@+id/navigation_drawer_left" 
    android:layout_width="@dimen/left_navigation_drawer_width" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="@android:color/transparent" 
    android:orientation="vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

    <LinearLayout 
     android:id="@+id/dashboard_drawer_tv_programs_ll" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="8dp" 
     android:padding="8dp" 
     android:clickable="true" 
     android:background="@drawable/button_background" 
     android:orientation="horizontal"> 

     <ImageView 
      android:layout_width="36dp" 
      android:layout_height="36dp" 
      android:src="@drawable/ic_tv_programs" /> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="36dp" 
      android:layout_marginLeft="16dp" 
      android:textSize="18sp" 
      android:textColor="@color/primary_text" 
      android:gravity="center_vertical" 
      android:text="@string/tv_show" /> 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/dashboard_drawer_settings_ll" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="8dp" 
     android:padding="8dp" 
     android:clickable="true" 
     android:background="@drawable/button_background" 
     android:orientation="horizontal"> 

     <ImageView 
      android:layout_width="36dp" 
      android:layout_height="36dp" 
      android:src="@drawable/ic_settings" /> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="36dp" 
      android:layout_marginLeft="16dp" 
      android:textSize="18sp" 
      android:textColor="@color/primary_text" 
      android:gravity="center_vertical" 
      android:text="@string/settings" /> 

    </LinearLayout> 

</com.acme.LeftNavigationDrawerView> 

因为这样你可以将其包含在你的活动XML在你需要它

<android.support.v4.widget.DrawerLayout 
    android:id="@+id/dashboard_activity_drawer_layout" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/epg_dashboard_bg"> 
    <!-- The main content view --> 
    <include layout="@layout/layout_dashboard_content" /> 
    <!-- The navigation drawer --> 
    <include layout="@layout/layout_navigation_drawer_left"/> 
</android.support.v4.widget.DrawerLayout> 

如果你不想使用魔法图书馆那使@Inject工作,然后参考the first half of this guide "The Android Way" on spring.io