【问题标题】:How to pass an intent to other activities while keeping the drawer, in Android?如何在Android中保留抽屉的同时将意图传递给其他活动?
【发布时间】:2015-07-13 11:53:08
【问题描述】:

我目前正在使用this site 的模板(带有导航抽屉)。然而,与大多数导航抽屉一样,片段用于保存抽屉项目。

我希望能够从活动 > 导航抽屉 > 片段 > 转到另一个活动,因为我想在该活动中包含谷歌地图。

为方便起见,此活动将被称为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", "johndoe@doe.com", 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 创建一个新的导航抽屉并用相同的项目填充它,但这不起作用。

【问题讨论】:

    标签: java android xml android-fragments navigation-drawer


    【解决方案1】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      相关资源
      最近更新 更多