Android导航抽屉具有多种活动

时间:2014-04-02 09:26:57

标签: android navigation android-activity drawer

我试图使用带有少量活动而没有碎片的导航抽屉。我在这里通过几个答案给我读了最后的文章,最后在this,我和用户Dediqated有同样的问题,这是我的代码:

BaseActivity.java:

import android.app.Activity;
import android.content.res.Configuration;
import android.content.res.Resources.NotFoundException;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class BaseActivity extends Activity {

    public DrawerLayout drawerLayout;
    public ListView drawerList;
    public String[] layers;
    private ActionBarDrawerToggle drawerToggle;

    protected void onCreate(Bundle savedInstanceState) {
        try {
            // R.id.drawer_layout should be in every activity with exactly the same
            // id.
            drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

            drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout,
                    R.drawable.ic_drawer, 0, 0) {
                public void onDrawerClosed(View view) {
                    getActionBar().setTitle(R.string.hello_world);
                }

                public void onDrawerOpened(View drawerView) {
                    getActionBar().setTitle(R.string.hello_world);
                }
            };
            drawerLayout.setDrawerListener(drawerToggle);

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

            layers = getResources().getStringArray(R.array.planets_array);
            drawerList = (ListView) findViewById(R.id.left_drawer);
            drawerList.setAdapter(new ArrayAdapter<String>(this,
                    R.layout.drawer_list_item, android.R.id.text1, layers));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            e.printStackTrace();
            e.printStackTrace();
        }

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (drawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return super.onOptionsItemSelected(item);

    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        drawerToggle.syncState();
    }

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

TestActivity.java:

import android.os.Bundle;

public class TestActivity extends BaseActivity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);
    }
}

activity_base.xml:

<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">

    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <!-- Add content here -->
    </FrameLayout>

    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

activity_profile.xml:

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".ProfileActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>

drawer_list_item.xml

<!--
  Copyright 2013 The Android Open Source Project

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
  -->

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:textColor="#fff"
    android:background="?android:attr/activatedBackgroundIndicator"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

在行drawerLayout.setDrawerListener(drawerToggle);中的BaseActivity.java中,Eclipse抛出NullPointerException,我只是不明白为什么。

我很抱歉为已经提出的问题提出了额外的问题,但我是新的,不允许添加评论。

2 个答案:

答案 0 :(得分:2)

您正在做的事情无法正常工作,因为您在设置内容视图之前呼叫findViewById 。这意味着您在设置布局之前尝试访问活动布局中的元素,或者换句话说,在初始化视图之前调用View.findViewById
另外,据我所知,您必须在活动中致电super.onCreate。你不是这样做的。您在super.onCreate中拨打TestActivity,但必须在BaseActivity中拨打。{。} 我没有和AB一起参加过多项活动,但我建议你做以下事情:

BaseActivity

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

void initDrawer(){
    // put everything you have in your onCreate in here:
    try {
        // R.id.drawer_layout should be in every activity with exactly the same
        // id.
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        drawerToggle = new ActionBarDrawerToggle((Activity) this, drawerLayout,
                R.drawable.ic_drawer, 0, 0) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(R.string.hello_world);
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(R.string.hello_world);
            }
        };
        drawerLayout.setDrawerListener(drawerToggle);

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

        layers = getResources().getStringArray(R.array.planets_array);
        drawerList = (ListView) findViewById(R.id.left_drawer);
        drawerList.setAdapter(new ArrayAdapter<String>(this,
                R.layout.drawer_list_item, android.R.id.text1, layers));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        e.printStackTrace();
        e.printStackTrace();
    }

}

测试活动

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

答案 1 :(得分:0)

使用BaseActivity的方法对我来说效果不佳。 Reason是Activity和Fragments的混合,以及在eclipse中创建新项目时生成的NavigationDrawerFragment的使用。

我有活动A,它有一个包含5个项目的菜单。 1个项目将启动另一个活动(因为它是FragmentPagerAdaper),其他项目只会在活动A中切换片段。

当我使用BaseActivity时,我只有一个onNavigationDrawerItemSelected(int)(click-event)。

在Activity B中也使用它会导致问题,因为我需要先切换回Activity A然后显示相应的Fragment。这实质上是不同的点击处理。

我最终在两个活动中都有onNavigationDrawerItemSelected(int)来解决它。实现抽屉只有2行,所以这不是太多的双重工作。如果我有更多活动,那么我会选择BaseActivity但是需要switch语句来处理案例,具体取决于调用活动。