多个活动的导航抽屉

时间:2014-12-15 09:42:27

标签: java android navigation-drawer

我试图让Android中的导航抽屉可以从所有Activity访问时遇到一些问题。我有一个NavigationDrawer.java:

public class NavigationDrawer extends Activity {

static Context context;
private DrawerLayout mDrawerLayout;
private ExpandableListView mDrawerList;
private LinearLayout navDrawerView;
CustomExpandAdapter customAdapter;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
private String[] mEventSelection;
private String[] mProfileSelection;
private int selectedPosition;
List<SampleTO> listParent;
HashMap<String, List<String>> listDataChild;
ArrayList<Event> newsFeedList = new ArrayList<Event>();

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    context = this;
    mTitle = mDrawerTitle = getTitle();

    navDrawerView = (LinearLayout) findViewById(R.id.navDrawerView);
    mEventSelection = getResources().getStringArray(R.array.event_array);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    mDrawerList = (ExpandableListView) findViewById(R.id.nav_left_drawer);
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
            GravityCompat.START);

    listParent = new ArrayList<SampleTO>();
    listDataChild = new HashMap<String, List<String>>();

    listParent.add(new SampleTO(getString(R.string.eventDrawer),
            R.drawable.event));

    listDataChild.put(getString(R.string.eventDrawer),
            Arrays.asList(mEventSelection));

    customAdapter = new CustomExpandAdapter(this, listParent, listDataChild);
    mDrawerList.setAdapter(customAdapter);
    mDrawerList.setChoiceMode(ExpandableListView.CHOICE_MODE_SINGLE);

    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open,
            R.string.drawer_close) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

// Navigation drawer with sub menu goes here
public void selectItem(int groupPosition, int position) {
    selectedPosition = position;
    mDrawerLayout.closeDrawer(navDrawerView);
    if (groupPosition == 0) {
        switch (selectedPosition) {
        case 0:
            break;
        case 1:
            break;
    }
    // Navigation item for event
    else if (groupPosition == 3) {
        switch (selectedPosition) {
        case 0:
            Intent eventMain = new Intent(context, EventMain.class);
            context.startActivity(eventMain);
            break;
        case 1:
            Toast.makeText(NavigationDrawer.this, "Analyze Event",
                    Toast.LENGTH_LONG).show();
            break;
        }
    }
    setTitle(mEventSelection[selectedPosition]);
}

@Override
public void setTitle(CharSequence title) {
    mTitle = title;
    getActionBar().setTitle(mTitle);
}

@Override
public void onResume() {
    super.onResume();
    mDrawerList.setOnGroupClickListener(new OnGroupClickListener() {

        public boolean onGroupClick(ExpandableListView parent, View v,
                int groupPosition, long id) {
            int index = parent.getFlatListPosition(ExpandableListView
                    .getPackedPositionForGroup(groupPosition));
            parent.setItemChecked(index, true);

            String parentTitle = ((SampleTO) customAdapter
                    .getGroup(groupPosition)).getTitle();

            if (parentTitle.equals(getString(R.string.amenityDrawer))) {
                Toast.makeText(NavigationDrawer.this, "Amenity",
                        Toast.LENGTH_LONG).show();
                setTitle(parentTitle);
                mDrawerLayout.closeDrawer(navDrawerView);
            }
            return false;
        }
    });

    mDrawerList.setOnChildClickListener(new OnChildClickListener() {

        public boolean onChildClick(ExpandableListView parent, View v,
                int groupPosition, int childPosition, long id) {

            int index = parent.getFlatListPosition(ExpandableListView
                    .getPackedPositionForChild(groupPosition, childPosition));
            parent.setItemChecked(index, true);
            selectItem(groupPosition, childPosition);
            return false;
        }
    });
}

@Override
protected void onDestroy() {
    super.onDestroy();
}

@Override
protected void onPause() {
    super.onPause();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(navDrawerView);
    return super.onPrepareOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    switch (item.getItemId()) {
    default:
        return super.onOptionsItemSelected(item);
    }
}

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

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}

}

然后当导航抽屉中的子项被选中时,我导航到我的第二个类EventMain.java:

public class EventMain extends NavigationDrawer {
public static MapView mMapView = null;
ArcGISTiledMapServiceLayer tileLayer;
LocationManager locationManager;
public static GraphicsLayer graphicsLayer = null;
public static Callout callout;

private int mYear, mMonth, mDay, mHour, mMinute;
private Calendar c;
static final int DATE_DIALOG_ID = 1;
static final int TIME_DIALOG_ID = 2;

private LinearLayout legendDiv, llNewsFeed, llSearch;
private ListView listview;
private Button btnNewsFeed, btnSearchAddr, btnLegends;
private EditText searchAddrET;
private ImageView ivEventGuide;

public static LinearLayout directionDiv;
public static TextView tvDirection, tvDirectionTitle, tvSearchTitle;
static EventController eventCtrl = new EventController();
static Event eventModel = new Event();

private ListAdapter mAdapter;
ArrayList<Event> newsFeedList = new ArrayList<Event>();

@Override
public void onCreate(Bundle savedInstanceState) {
    ArcGISRuntime.setClientId("UkIVSWzquykoxCMG");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.event_main);
    context = this;
}
  @Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.event_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.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

它确实显示了EventMain.java上的导航抽屉图标。但是,当我尝试扩展它时,它不起作用。有什么想法吗?

提前致谢。

我的EventMain的xml布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

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

    <com.esri.android.map.MapView
        android:id="@+id/map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        initExtent="21801.3, 25801.0, 33218.7, 44830.0" >
    </com.esri.android.map.MapView>

    //Other linear and relative layouts
 </FrameLayout>
</LinearLayout>

1 个答案:

答案 0 :(得分:2)

EventMain的{​​{1}}方法中,在调用onCreate()方法后调用setContentView()。这导致基类super.onCreate()中的DrawerLayout集被替换,从而有效地删除了抽屉。为防止出现这种情况,我们确保NavigationDrawer包含主要内容的标准容器DrawerLayout,并将FrameLayout的布局扩展到其中。

基本活动的布局EventMain

main.xml

在Activity子类中,<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/event_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> ... </android.support.v4.widget.DrawerLayout>

EventMain