如何在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