Laci Navigasi yang Sama dalam Berbagai Aktivitas


206

Saya membuat laci navigasi yang berfungsi seperti yang ditunjukkan pada tutorial di situs web developer.android.com . Tapi sekarang, saya ingin menggunakan satu Navigasi Drawer, saya buat di NavigationDrawer.class untuk beberapa Kegiatan di Aplikasi saya.

Pertanyaan saya adalah, jika ada orang di sini dapat membuat sedikit Tutorial, yang menjelaskan, bagaimana cara menggunakan satu laci Navigasi untuk beberapa Kegiatan.

Saya membacanya pertama kali di Jawaban ini Laci Navigasi Android pada beberapa Kegiatan

tetapi itu tidak berhasil pada Proyek saya

public class NavigationDrawer extends Activity {
public DrawerLayout drawerLayout;
public ListView drawerList;
private ActionBarDrawerToggle drawerToggle;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    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.app_name);
        }

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

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

    layers = getResources().getStringArray(R.array.layers_array);
    drawerList = (ListView) findViewById(R.id.left_drawer);
    View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
    drawerList.addHeaderView(header, null, false);
    drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
            layers));
    View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
            R.layout.drawer_list_footer, null, false);
    drawerList.addFooterView(footerView);

    drawerList.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
            map.drawerClickEvent(pos);
        }
    });
}

@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);
}
}

Dalam Kegiatan ini saya ingin memiliki Navigasi Drawer jadi saya memperluas 'NavigationDrawer' dan dalam beberapa Kegiatan lain saya ingin Pengguna laci Navigasi yang Sama

  public class SampleActivity extends NavigationDrawer {...}

Saya tidak tahu harus berubah apa ...


1
Anda dapat menemukan contoh di sini .
Naddy

Jawaban:


188

Jika Anda ingin laci navigasi, Anda harus menggunakan fragmen. Saya mengikuti tutorial ini minggu lalu dan ini berhasil:

http://developer.android.com/training/implementing-navigation/nav-drawer.html

Anda juga dapat mengunduh kode sampel dari tutorial ini, untuk melihat bagaimana Anda dapat melakukan ini.


Tanpa fragmen:

Ini adalah Kode BaseActivity Anda:

public class BaseActivity extends Activity
{
    public DrawerLayout drawerLayout;
    public ListView drawerList;
    public String[] layers;
    private ActionBarDrawerToggle drawerToggle;
    private Map map;

    protected void onCreate(Bundle savedInstanceState)
    {
        // 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.app_name);
            }

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

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

        layers = getResources().getStringArray(R.array.layers_array);
        drawerList = (ListView) findViewById(R.id.left_drawer);
        View header = getLayoutInflater().inflate(R.layout.drawer_list_header, null);
        drawerList.addHeaderView(header, null, false);
        drawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, android.R.id.text1,
                layers));
        View footerView = ((LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
                R.layout.drawer_list_footer, null, false);
        drawerList.addFooterView(footerView);

        drawerList.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int pos, long arg3) {
                map.drawerClickEvent(pos);
            }
        });
    }

    @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);
    }
}

Semua Kegiatan lain yang perlu memiliki laci navigasi harus memperluas Kegiatan ini, bukan Kegiatan itu sendiri, contoh:

public class AnyActivity extends BaseActivity
{
    //Because this activity extends BaseActivity it automatically has the navigation drawer
    //You can just write your normal Activity code and you don't need to add anything for the navigation drawer
}

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" >
        <!-- Put what you want as your normal screen in here, you can also choose for a linear layout or any other layout, whatever you prefer -->
    </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>

Edit:

Saya mengalami beberapa kesulitan sendiri, jadi di sini adalah solusi jika Anda mendapatkan NullPointerExceptions. Di BaseActivity ubah fungsi onCreate menjadi protected void onCreateDrawer(). Sisanya bisa tetap sama. Dalam Aktivitas yang memperluas BaseActivity masukkan kode dalam urutan ini:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    super.onCreateDrawer();

Ini membantu saya memperbaiki masalah saya, semoga membantu!

Ini adalah bagaimana Anda dapat membuat laci navigasi dengan banyak aktivitas, jika Anda memiliki pertanyaan, jangan ragu untuk bertanya.


Edit 2:

Seperti yang dikatakan oleh @GregDan Anda BaseActivityjuga dapat mengganti setContentView()dan memanggil onCreateDrawer di sana:

@Override 
public void setContentView(@LayoutRes int layoutResID) 
{ 
    super.setContentView(layoutResID); 
    onCreateDrawer() ;
}

7
Saya tidak ingin menggunakan aktivitas di atas fragmen, saya hanya ingin menggunakan aktivitas berbeda yang menggunakan semua laci navigasi yang sama. Saya ingin aktivitas, karena di sana saya dapat menggunakan berbagai jenis tata letak seperti tampilan geser, tampilan peta ...
MEX

135
Hanya memiliki satu Kegiatan dapat menjadi tugas yang menakutkan untuk aplikasi yang cukup kompleks. Menggunakan Aktivitas memberi Anda banyak hal gratis dari sistem - jadi itu adalah poin yang valid bagaimana menggunakan beberapa Aktivitas. Saya tidak bisa membayangkan satu aktivitas menangani komunikasi antara sejumlah kombinasi fragmen - itu tidak akan berhasil.
slot

1
Maafkan saya butuh waktu lama untuk saya jawab. Saya mengedit jawaban saya. Saya percaya ini adalah tutorial yang Anda cari. Semoga ini membantu.
Kevin van Mierlo

2
@KevinvanMierlo dapatkah Anda memberi tahu saya apa yang Anda maksud dengan: R.id.drawer_layout harus dalam setiap aktivitas dengan id yang persis sama. Karena saya melakukan persis seperti yang Anda katakan di sini dan saya mendapatkan metode NullPointerException di onCreate () dari Kegiatan yang memperluas BaseActivity ini ..
Loolooii

1
@ KevinvanMierlo btw, saya pikir Anda lupa 2 baris ini? super.onCreate (SavedInstanceState); setContentView (R.layout.activity_base);
Loolooii

34

Saya telah menemukan implementasi terbaik. Ada di aplikasi Google I / O 2014 .

Mereka menggunakan pendekatan yang sama dengan Kevin. Jika Anda dapat mengambil sendiri dari semua hal yang tidak dibutuhkan dalam aplikasi I / O, Anda dapat mengekstraksi semua yang Anda butuhkan dan dijamin oleh Google bahwa ini adalah penggunaan pola laci navigasi yang benar. Setiap aktivitas secara opsional memiliki DrawerLayouttata letak utama. Bagian yang menarik adalah bagaimana navigasi ke layar lain dilakukan. Diimplementasikan BaseActivityseperti ini:

private void goToNavDrawerItem(int item) {
        Intent intent;
        switch (item) {
            case NAVDRAWER_ITEM_MY_SCHEDULE:
                intent = new Intent(this, MyScheduleActivity.class);
                startActivity(intent);
                finish();
                break;

Ini berbeda dari cara umum mengganti fragmen saat ini dengan transaksi fragmen. Tetapi pengguna tidak melihat perbedaan visual.


Ini ^ saya tidak tahu bagaimana mereka memulai kegiatan baru dan bekerja dengan sempurna. Ini adalah aplikasi besar untuk dikerjakan.
hitch.united

@ hitch.united Itu karena mereka menggunakan banyak fragmen dan hanya beberapa kegiatan.
Joaquin Iurchuk

@ hitch.united mereka mungkin mengganti animasi aktivitas dengan overridePendingTransitions.
EpicPandaForce

itu Memuat fragmen alih-alih aktivitas subklasifikasi?
Vikas Pandey

Ini file dari Oktober 2014: github.com/google/iosched/blob/…
denvercoder9

8

Jadi jawaban ini terlambat beberapa tahun tetapi seseorang mungkin menghargainya. Android telah memberi kami widget baru yang mempermudah penggunaan satu laci navigasi dengan beberapa kegiatan lebih mudah.

android.support.design.widget.NavigationView adalah modular dan memiliki tata letak sendiri di folder menu. Cara Anda menggunakannya adalah untuk membungkus tata letak xml dengan cara berikut:

  1. Root Layout adalah android.support.v4.widget.DrawerLayout yang berisi dua anak: <include ... />tata letak yang sedang dibungkus (lihat 2) dan android.support.design.widget.NavigationView.

    <android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:openDrawer="start">
    
    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />
    

nav_header_main hanyalah LinearLayout dengan orientasi = vertikal untuk header Drawar Navigasi Anda.

activity_main_drawer adalah menu xml di direktori res / menu Anda. Ini dapat berisi item dan grup pilihan Anda. Jika Anda menggunakan Galeri AndroidStudio, wizard akan membuat yang dasar untuk Anda dan Anda dapat melihat apa pilihan Anda.

  1. Tata letak bilah aplikasi biasanya sekarang menjadi android.support.design.widget.CoordinatorLayout dan ini akan mencakup dua anak: android.support.design.widget.AppBarLayout (yang berisi android.support.v7.widget.Toolbar), dan <include ... >untuk konten Anda yang sebenarnya (lihat 3).

    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="yourpackage.MainActivity">
    
     <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    
    </android.support.design.widget.AppBarLayout>
    
    <include layout="@layout/content_main" />
    

  2. Tata letak konten dapat berupa tata letak apa pun yang Anda inginkan. Ini adalah tata letak yang berisi konten utama aktivitas (tidak termasuk laci navigasi atau bilah aplikasi).

Sekarang, hal paling keren tentang semua ini adalah Anda dapat membungkus setiap aktivitas dalam dua tata letak ini tetapi memiliki NavigationView Anda (lihat langkah 1) selalu arahkan ke activity_main_drawer (atau apa pun). Ini berarti bahwa Anda akan memiliki Laci Navigasi yang sama (*) pada semua aktivitas.

  • Mereka tidak akan menjadi contoh yang sama dari NavigationView tetapi, untuk bersikap adil, itu tidak mungkin bahkan dengan solusi BaseActivity yang diuraikan di atas.

stackoverflow memotong beberapa tanda kurung xml yang terlampir tetapi yang penting ada di sana.
jwehrle

tetapi bagaimana Anda memperlakukan fungsionalitas seperti tombol? Anda harus menulis kode yang sama di setiap kegiatan?
Laur89

Ya, karena ini adalah contoh yang terpisah. Namun, Anda dapat membuat kelas super untuk memperluas aktivitas Anda dan meletakkan kode itu di sana sekali.
jwehrle

@jwehrle dapatkah Anda menulis contoh tentang membuat kelas super untuk kegiatan kami?
CDrosos

public abstract class MyBaseActivity meluas AppCompatActivity alat NavigationView.OnNavigationItemSelectedListener {// melaksanakan berikut: Override public boolean onNavigationItemSelected (@NonNull MenuItem item) {}} class MyActivity publik meluas MyBaseActivity {}
jwehrle

7

Cara termudah untuk menggunakan kembali laci Navigasi yang umum di antara sekelompok kegiatan

app_base_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

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

    </FrameLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/menu_test"
        />
</android.support.v4.widget.DrawerLayout>

AppBaseActivity.java

/*
* This is a simple and easy approach to reuse the same 
* navigation drawer on your other activities. Just create
* a base layout that conains a DrawerLayout, the 
* navigation drawer and a FrameLayout to hold your
* content view. All you have to do is to extend your 
* activities from this class to set that navigation 
* drawer. Happy hacking :)
* P.S: You don't need to declare this Activity in the 
* AndroidManifest.xml. This is just a base class.
*/
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

public abstract class AppBaseActivity extends AppCompatActivity implements MenuItem.OnMenuItemClickListener {
    private FrameLayout view_stub; //This is the framelayout to keep your content view
    private NavigationView navigation_view; // The new navigation view from Android Design Library. Can inflate menu resources. Easy
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private Menu drawerMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.app_base_layout);// The base layout that contains your navigation drawer.
        view_stub = (FrameLayout) findViewById(R.id.view_stub);
        navigation_view = (NavigationView) findViewById(R.id.navigation_view);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 0, 0);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        drawerMenu = navigation_view.getMenu();
        for(int i = 0; i < drawerMenu.size(); i++) {
          drawerMenu.getItem(i).setOnMenuItemClickListener(this);
        }
        // and so on...
    }

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

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

    /* Override all setContentView methods to put the content view to the FrameLayout view_stub
     * so that, we can make other activity implementations looks like normal activity subclasses.
     */
    @Override
    public void setContentView(int layoutResID) {
        if (view_stub != null) {
            LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
            View stubView = inflater.inflate(layoutResID, view_stub, false);
            view_stub.addView(stubView, lp);
        }
    }

    @Override
    public void setContentView(View view) {
        if (view_stub != null) {
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
            view_stub.addView(view, lp);
        }
    }

    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        if (view_stub != null) {
            view_stub.addView(view, params);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Pass the event to ActionBarDrawerToggle, if it returns
        // true, then it has handled the app icon touch event
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle your other action bar items...

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.item1:
                // handle it
                break;
            case R.id.item2:
                // do whatever
                break;
            // and so on...
        }
        return false;
    }
}

Bisakah Anda memberikan contoh kegiatan yang menggunakan aktivitas dasar ini?
CDrosos

Tidak bisa mengingat detail apa pun tentang ini, saya pikir hanya perlu memperluas AppBaseActivity dan setContentViewcara standarnya akan berfungsi.
Levon Petrosyan

6

Untuk orang lain yang ingin melakukan apa yang diminta poster asli, harap pertimbangkan untuk menggunakan fragmen sebagai ganti cara Kevin mengatakan. Berikut ini adalah tutorial yang sangat baik tentang cara melakukannya:

https://github.com/codepath/android_guides/wiki/Fragment-Navigation-Drawer

Jika Anda memilih untuk menggunakan aktivitas alih-alih fragmen, Anda akan mengalami masalah laci nav yang dibuat ulang setiap kali Anda menavigasi ke aktivitas baru. Ini menghasilkan rendering nav yang jelek / lambat setiap kali.


5

Saran saya adalah: jangan gunakan aktivitas sama sekali, sebaliknya gunakan fragmen, dan ganti mereka dalam wadah (Linear Layout misalnya) tempat Anda menunjukkan fragmen pertama Anda.

Kode tersedia di Tutorial Pengembang Android, Anda hanya perlu menyesuaikan.

http://developer.android.com/training/implementing-navigation/nav-drawer.html

Dianjurkan agar Anda harus menggunakan lebih banyak dan lebih banyak fragmen dalam aplikasi Anda, dan seharusnya hanya ada empat kegiatan dasar lokal untuk aplikasi Anda, yang Anda sebutkan di AndroidManifest.xml Anda terpisah dari yang eksternal (FacebookActivity misalnya):

  1. SplashActivity: tidak menggunakan fragmen, dan menggunakan tema Layar Penuh.

  2. LoginSignUpActivity: Tidak memerlukan NavigationDrawer sama sekali, dan tidak ada tombol kembali juga, jadi cukup gunakan toolbar normal, tetapi setidaknya, 3 atau 4 fragmen akan diperlukan. Menggunakan tema tanpa-tindakan-bilah

  3. BerandaAktivitas atau Aktivitas DashBoard: Menggunakan tema no-action-bar. Di sini Anda memerlukan laci Navigasi, juga semua layar yang mengikuti akan menjadi fragmen atau fragmen bersarang, hingga tampilan daun, dengan laci bersama. Semua pengaturan, profil pengguna, dll. Akan ada di sini sebagai fragmen, dalam aktivitas ini. Fragmen di sini tidak akan ditambahkan ke tumpukan belakang dan akan dibuka dari item menu laci. Dalam hal fragmen yang membutuhkan tombol kembali dan bukan laci, ada jenis aktivitas keempat di bawah ini.

  4. Aktivitas tanpa laci. Aktivitas ini memiliki tombol kembali di atas dan fragmen di dalamnya akan berbagi bilah tindakan yang sama. Fragmen-fragmen ini akan ditambahkan ke tumpukan-belakang, karena akan ada riwayat navigasi.

[Untuk panduan lebih lanjut, lihat: https://stackoverflow.com/a/51100507/787399 ]

Selamat Coding !!


Ini pos lama. Anda dapat menggunakan fragmen untuk memastikan Anda selalu memiliki satu aktivitas. Anda terus mengganti fragmen dalam satu wadah yang didedikasikan untuk itu. Masukkan tumpukan kembali ketika Anda membutuhkan navigasi mundur, atau pop semua fragmen ketika Anda membutuhkan fragmen untuk ditampilkan sebagai yang pertama.
Abhinav Saxena

@ Cabuxa.Mapache Silakan periksa tautan terlampir ke jawaban saya untuk mendapatkan bantuan lebih lanjut. Saya telah menggunakan BaseActivity umum, yang membantu berbagi ActionBar ToolBar dan NavigatonDrawer dan komponen lainnya di semua fragmen yang melekat padanya.
Abhinav Saxena

1

perbarui kode ini dalam aktivitas dasar. dan jangan lupa untuk memasukkan drawer_list_header dalam aktivitas Anda xml.

super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.drawer_list_header);

dan jangan gunakan permintaan () dalam aktivitas Anda. tapi laci masih tidak terlihat saat mengklik gambar..dan dengan menyeretnya akan terlihat tanpa daftar item. Saya sudah mencoba banyak tetapi tidak berhasil. butuh latihan untuk ini ...


1

Dengan jawaban @Kevin van Mierlo, Anda juga dapat menerapkan beberapa laci. Misalnya, menu default terletak di sisi kiri (mulai), dan menu opsional lebih lanjut, yang terletak di sisi kanan, yang hanya ditampilkan ketika fragmen determinasi dimuat.

Saya sudah bisa melakukan itu.


1
package xxxxxx;



import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.widget.SearchView;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;


public class loginhome extends AppCompatActivity {
    private Toolbar toolbar;
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;

    // Make sure to be using android.support.v7.app.ActionBarDrawerToggle version.
    // The android.support.v4.app.ActionBarDrawerToggle has been deprecated.
    private ActionBarDrawerToggle drawerToggle;

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

        // Initializing Toolbar and setting it as the actionbar
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        //Initializing NavigationView


        navigationView = (NavigationView) findViewById(R.id.nav_view);

        //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            // This method will trigger on item Click of navigation menu

            public boolean onNavigationItemSelected(MenuItem menuItem) {


                //Checking if the item is in checked state or not, if not make it in checked state
                if(menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

                //Closing drawer on item click
                drawerLayout.closeDrawers();

                //Check to see which item was being clicked and perform appropriate action
                switch (menuItem.getItemId()){


                    //Replacing the main content with ContentFragment Which is our Inbox View;
                    case R.id.nav_first_fragment:
                        Toast.makeText(getApplicationContext(),"First fragment",Toast.LENGTH_SHORT).show();
                         FirstFragment fragment = new FirstFragment();
                        android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction.replace(R.id.frame,fragment);
                        fragmentTransaction.commit();
                        return true;

                    // For rest of the options we just show a toast on click
                    case R.id.nav_second_fragment:
                        Toast.makeText(getApplicationContext(),"Second fragment",Toast.LENGTH_SHORT).show();
                        SecondFragment fragment2 = new SecondFragment();
                        android.support.v4.app.FragmentTransaction fragmentTransaction2 = getSupportFragmentManager().beginTransaction();
                        fragmentTransaction2.replace(R.id.frame,fragment2);
                        fragmentTransaction2.commit();
                        return true;

                    default:
                        Toast.makeText(getApplicationContext(),"Somethings Wrong",Toast.LENGTH_SHORT).show();
                        return true;

                }
            }
        });

        // Initializing Drawer Layout and ActionBarToggle
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close){

            @Override
            public void onDrawerClosed(View drawerView) {
                // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank
                super.onDrawerClosed(drawerView);
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank

                super.onDrawerOpened(drawerView);
            }
        };

        //Setting the actionbarToggle to drawer layout
        drawerLayout.setDrawerListener(actionBarDrawerToggle);

        //calling sync state is necessay or else your hamburger icon wont show up
        actionBarDrawerToggle.syncState();







    }

gunakan ini untuk toolbar.xml Anda

<?xml version="1.0" encoding="utf-8"?>

    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:elevation="4dp"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark"


        >

    </android.support.v7.widget.Toolbar>

gunakan ini untuk tajuk navigasi jika ingin digunakan

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:background="?attr/colorPrimaryDark"
    android:padding="16dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
    android:orientation="vertical"
    android:gravity="bottom">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:id="@+id/navhead"
        android:orientation="vertical"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="16dp"
            android:textColor="#ffffff"
            android:text="tanya"
            android:textSize="14sp"
            android:textStyle="bold"

            />

        <TextView
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="5dp"
            android:text="tanya.com"
            android:textSize="14sp"
            android:textStyle="normal"

            />
    </LinearLayout>
    <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_below="@+id/imageView"
        android:layout_marginTop="15dp"

        android:src="@drawable/face"
        android:id="@+id/circleView"
        />



</RelativeLayout>

1

Saya melakukannya di Kotlin seperti ini:

open class BaseAppCompatActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {

protected lateinit var drawerLayout: DrawerLayout
protected lateinit var navigationView: NavigationView
@Inject
lateinit var loginService: LoginService

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    Log.d("BaseAppCompatActivity", "onCreate()")
    App.getComponent().inject(this)
    drawerLayout = findViewById(R.id.drawer_layout) as DrawerLayout

    val toolbar = findViewById(R.id.toolbar) as Toolbar
    setSupportActionBar(toolbar)

    navigationView = findViewById(R.id.nav_view) as NavigationView
    navigationView.setNavigationItemSelectedListener(this)

    val toggle = ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)

    drawerLayout.addDrawerListener(toggle)
    toggle.syncState()
    toggle.isDrawerIndicatorEnabled = true

    val navigationViewHeaderView = navigationView.getHeaderView(0)
    navigationViewHeaderView.login_txt.text = SharedKey.username
}
private inline fun <reified T: Activity> launch():Boolean{
    if(this is T) return closeDrawer()
    val intent = Intent(applicationContext, T::class.java)
    startActivity(intent)
    finish()
    return true
}

private fun closeDrawer(): Boolean {
    drawerLayout.closeDrawer(GravityCompat.START)
    return true
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
    val id = item.itemId

    when (id) {
        R.id.action_tasks -> {
            return launch<TasksActivity>()
        }
        R.id.action_contacts -> {
            return launch<ContactActivity>()
        }
        R.id.action_logout -> {
            createExitDialog(loginService, this)
        }
    }
    return false
}
}

Aktivitas untuk laci harus mewarisi ini BaseAppCompatActivity, panggilan super.onCreatesetelah konten diatur (sebenarnya, dapat dipindahkan ke beberapa metode init) dan memiliki elemen yang sesuai untuk id dalam tata letak mereka


Saya ingin mencoba solusi Anda tetapi saya mendapatkan kesalahan ini: "Aktivitas ini sudah memiliki panel tindakan yang disediakan oleh dekorasi jendela". Saya ingin beralih di antara 3 kegiatan dan masing-masing memiliki bilah aplikasi sendiri. Apakah Anda pikir itu mungkin?
Hindari

Saya pikir, Anda perlu memindahkan bilah tindakan ke fragmen dalam kasus itu. Dalam aplikasi kami, kami menggunakan tema NoActionBar dan menyediakan bilah alat untuk kompatibilitas, sejauh yang saya ingat.
Pavlus

@Pluslus akan seperti apa kode pada aktivitas kedua? kelas trackActivity: BaseAppCompatActivity () {?
Craig P

0

Jawaban saya hanyalah jawaban konseptual tanpa kode sumber. Mungkin bermanfaat bagi sebagian pembaca seperti saya untuk memahaminya.

Itu tergantung pada pendekatan awal Anda tentang bagaimana Anda membuat arsitektur aplikasi Anda. Pada dasarnya ada dua pendekatan.

  1. Anda membuat satu aktivitas (aktivitas dasar) dan semua tampilan dan layar lainnya akan menjadi fragmen. Aktivitas dasar itu berisi implementasi untuk Layer dan Coordinator Layouts. Ini sebenarnya adalah cara yang saya sukai karena memiliki fragmen-fragmen mandiri yang kecil akan membuat pengembangan aplikasi lebih mudah dan lebih lancar.

  2. Jika Anda telah memulai pengembangan aplikasi Anda dengan aktivitas, satu untuk setiap layar, maka Anda mungkin akan membuat aktivitas dasar, dan semua aktivitas lain meluas darinya. Aktivitas dasar akan berisi kode untuk implementasi laci dan koordinator. Setiap aktivitas yang membutuhkan implementasi laci dapat diperluas dari aktivitas dasar.

Saya pribadi lebih suka menghindari menggunakan fragmen dan aktivitas yang dicampur tanpa pengorganisasian. Itu membuat pengembangan lebih sulit dan membuat Anda macet pada akhirnya. Jika Anda telah melakukannya, perbaiki kode Anda.


-1

Buat laci Navigasi di MainActivity Anda menggunakan fragmen.
Inisialisasi Laci Navigasi di MainActivity
sekarang di semua aktivitas lain yang ingin Anda gunakan Laci Navigasi yang sama, tempatkan DrawerLayout sebagai basis dan pilah sebagai laci navigasi. Cukup atur android: name pada fragmen Anda yang menunjuk ke file Java fragmen Anda. Anda tidak perlu menginisialisasi fragmen di Aktivitas lain.
Anda dapat mengakses Nav Drawer dengan menggesekkan aktivitas lain seperti di aplikasi Google Play Store

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.