Android:任何活动的导航抽屉菜单

Android: Navigation drawer menu on any activities

我使用 ExpandableListView 制作了一个左侧菜单,这个在我的 MainActivity 上效果很好。现在我想在我的其他活动中使用它,我该如何简单地做到这一点?

我应该为菜单创建一个 class 还是可以重新使用我的 MainActivity

这是我的代码 MainActivity:

public class MainActivity extends BaseMenuActivity {

public static final String SAVE_VALUES = "SaveFile";
static String saveDirectory = String.valueOf(Environment.getExternalStorageDirectory());
static String backgroundPath;
static ImageView layout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);

    layout = (ImageView) findViewById(R.id.background);
    SharedPreferences setting = getSharedPreferences(SAVE_VALUES,0);
    String backgrounImage = setting.getString("backgroundImage","bc_lip");
    backgroundPath = saveDirectory + "/galaxyv2Img/" + backgrounImage + ".jpg";
    Drawable background = Drawable.createFromPath(backgroundPath);
    layout.setBackgroundDrawable(background);

    UpdateDatabaseCsv tt = new UpdateDatabaseCsv(MainActivity.this);
    tt.open();
    tt.close();

}

@Override
public int getContentView() {
    return R.layout.activity_main;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.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();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        Intent i = new Intent(this, SettingActivity .class);
        startActivity(i);
    }

    return super.onOptionsItemSelected(item);
}

我的更新activity:

public class UpdateActivity extends BaseMenuActivity {
public static final String SAVE_VALUES = "SaveFile";
public final String downloadDirectory = Environment.getExternalStorageDirectory() + "/galaxyv2/download/";
ProgressDialog barProgressDialog;
Button btnStartProgress;
FtpGetter ftp;
int progressBarStatus = 0;
String ftpLink, ftpPassword, ftpHost, ftpUser;
FilesManager filesManager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_update);
    filesManager = new FilesManager(this);
    Intent intent = getIntent();
    String value = intent.getStringExtra("todo");
    ftp = new FtpGetter();
}

@Override
public int getContentView() {
    return R.layout.activity_update;
}

主要活动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">

<ImageView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/background"
    android:scaleType="fitXY"
    />



<!-- ExpandableListview to display slider menu -->
<ExpandableListView
    android:id="@+id/list_slidermenu"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@color/list_divider"
    android:dividerHeight="1dp"        
    android:listSelector="@drawable/list_selector"
    android:background="@color/list_background">
</ExpandableListView>

更新活动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">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/update_start_update"
        android:id="@+id/button_update_start"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    </RelativeLayout>


<!-- ExpandableListview to display slider menu -->
<ExpandableListView
    android:id="@+id/list_slidermenu"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@color/list_divider"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/list_selector"
    android:background="@color/list_background">
</ExpandableListView>

问题是我不能使用旧的 UpdateActivity xml 和 RelativeLayout

你应该创建一个activity 与侧边菜单的登录并调用BaseMenuActivity.class(例如)。您希望拥有此菜单的所有 activity 都应从 de BaseMenuActivity 扩展,并且内容视图应具有相同的组件。

也许你应该在 parent activity 中实现这样一个抽象函数:

public abstract int getContentView();

并替换你的:

setContentView(R.layout.main_layout)

用于:

setContentView(getContentView());

在你的childactivity中实现这个函数

 @Override
    public int getContentView() {
        return R.layout.layout;
    }

此代码允许您从 child 分配布局 xml,并且 parent 可以访问它。如果您不执行此操作,则无法从 parent activity 访问视图以配置导航抽屉。

考虑浏览 Google I/O 2014 Source Code - 他们已经使用 BaseActivity class 实现了 NavigationDrawer。

您也可以尝试使用一些可以帮助您轻松实现 NavigationDrawer 的库,查看 Android Arsenal Sliding Panels 部分。

如果您想为每个 activity 自定义包含布局,我认为您应该使用这样的东西:

//update_activity.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">

    <!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <!-- As the main content view, the view below consumes the entire
             space available using match_parent in both dimensions. -->


            <RelativeLayout
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                >
                //change this with your views for each activity
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:id="@+id/customImageView"
                    />
            </RelativeLayout>



        <!-- android:layout_gravity="start" tells DrawerLayout to treat
             this as a sliding drawer on the left side for left-to-right
             languages and on the right side for right-to-left languages.
             If you're not building against API 17 or higher, use
             android:layout_gravity="left" instead. -->
        <!-- The drawer is given a fixed width in dp and extends the full height of
             the container. -->
       <!-- ExpandableListview to display slider menu -->
<ExpandableListView
    android:id="@+id/list_slidermenu"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:choiceMode="singleChoice"
    android:divider="@color/list_divider"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/list_selector"
    android:background="@color/list_background">

    </android.support.v4.widget.DrawerLayout>
</RelativeLayout>

//UpdateActivity.class

public class UpdateActivity extends BaseMenuActivity {
public static final String SAVE_VALUES = "SaveFile";
public final String downloadDirectory = Environment.getExternalStorageDirectory() + "/galaxyv2/download/";
ProgressDialog barProgressDialog;
Button btnStartProgress;
FtpGetter ftp;
int progressBarStatus = 0;
String ftpLink, ftpPassword, ftpHost, ftpUser;
FilesManager filesManager;
ImageView customImageView,
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_update);
    filesManager = new FilesManager(this);
    Intent intent = getIntent();
    String value = intent.getStringExtra("todo");
    ftp = new FtpGetter();
    customImageView = (ImageView) findViewById(R.id.customImageView);
 }

@Override
public int getContentView() {
    return R.layout.activity_update;
}

在名为“@+id/container”的 RelativeLayout 中,您可以添加任何您想要的内容并为每个 activity 自定义并在子 activity 中实例化。