Farklı Etkinliklerde Aynı Gezinme Çekmecesi


206

Developer.android.com web sitesindeki eğitimde gösterildiği gibi çalışan bir gezinme çekmecesi yaptım . Ama şimdi, bir Gezinme Çekmecesi kullanmak istiyorum, ben uygulamamda birden fazla Etkinlik için NavigationDrawer.class içinde oluşturdum.

Benim sorum, burada herhangi biri, birden fazla Etkinlik için bir Gezinme çekmecesinin nasıl kullanılacağını açıklayan küçük bir Öğretici yapabilirse.

Önce bu cevabı okudum Birden fazla Etkinlik Android Navigasyon Çekmecesi

ama Projemde işe yaramadı

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

Bu Etkinlikte Gezinme Çekmecesi olmasını istiyorum, böylece 'NavigationDrawer'ı genişletiyorum ve diğer bazı Etkinliklerde Aynı Gezinme çekmecesini Kullanmak istiyorum

  public class SampleActivity extends NavigationDrawer {...}

Neyi değiştireceğimi bilmiyorum ...


1
Örnekleri burada bulabilirsiniz .
Naddy

Yanıtlar:


188

Gezinme çekmecesi istiyorsanız, parçaları kullanmalısınız. Bu dersi geçen hafta izledim ve harika çalışıyor:

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

Bunu nasıl yapabileceğinizi görmek için bu öğreticiden örnek kod da indirebilirsiniz.


Parçalar olmadan:

Bu BaseActivity Kodunuz:

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

Gezinme çekmecesi olması gereken diğer tüm Etkinlikler, Etkinliğin kendisi yerine bu Etkinliği genişletmelidir, örnek:

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>

Düzenle:

Kendimde bazı zorluklar yaşadım, bu yüzden NullPointerExceptions'ı alırsanız bir çözüm. BaseActivity'de onCreate işlevini olarak değiştirin protected void onCreateDrawer(). Gerisi aynı kalabilir. BaseActivity'yi genişleten Etkinliklerde kodu şu sırayla yerleştirin:

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

Bu sorunumu düzeltmeme yardımcı oldu, umarım yardımcı olur!

Herhangi bir sorunuz varsa, sormaktan çekinmeyin, birden fazla aktiviteye sahip bir navigasyon çekmecesi bu şekilde oluşturabilirsiniz.


Düzenleme 2:

@GregDan tarafından söylendiği gibi, BaseActivitygeçersiz kılıp setContentView()onCreateDrawer'ı buradan arayabilirsiniz:

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

7
Aktiviteleri fragmanlar üzerinde kullanmak istemiyorum, sadece aynı navigasyon çekmecesini kullanan farklı aktiviteler kullanmak istiyorum. Etkinlik istiyorum, çünkü orada kaydırma görünümü, harita görünümü gibi farklı düzen türleri kullanabilirim
MEX

135
Tek bir Etkinliğe sahip olmak, oldukça karmaşık herhangi bir uygulama için göz korkutucu bir görev olabilir. Etkinlikler'i kullanmak, sistemden size birçok ücretsiz şey verir - bu nedenle birden çok Etkinliğin nasıl kullanılacağı geçerli bir noktadır. Herhangi bir sayıda fragman kombinasyonu arasındaki iletişimi ele alan bir Etkinlik hayal edemiyorum - bu işe yaramayacak.
slott

1
Üzgünüm cevap vermem çok uzun sürdü. Cevabımı düzenledim. Bu aradığınız öğretici olduğuna inanıyorum. Bu yardımcı olur umarım.
Kevin van Mierlo

2
@KevinvanMierlo bana ne demek istediğini söyleyebilir misin: R.id.drawer_layout tam olarak aynı kimliğe sahip her aktivitede olmalı. Çünkü tam olarak burada söylediğini yaptım ve ben bu BaseActivity genişleten Faaliyetin onCreate () yönteminde bir NullPointerException olsun ..
Loolooii

1
@KevinvanMierlo btw, sanırım bu 2 satırı mı unuttun? super.onCreate (savedInstanceState); setContentView (R.layout.activity_base);
Loolooii

34

En iyi uygulamayı buldum. Bu öyle Google I / O 2014 app.

Kevin'inkiyle aynı yaklaşımı kullanıyorlar. G / Ç uygulamasında gereksiz tüm şeylerden soyutlanabiliyorsanız, ihtiyacınız olan her şeyi çıkarabilirsiniz ve bunun Google tarafından navigasyon çekmecesi deseninin doğru kullanımı olduğundan emin olabilirsiniz. Her etkinliğin isteğe bağlı DrawerLayoutolarak ana düzeni vardır. İlginç olan, diğer ekranlara geçişin nasıl yapıldığı. Bu şekilde uygulanır BaseActivity:

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

Bu, mevcut fragmanın bir fragman işlemi ile değiştirilmesinin ortak yolundan farklıdır. Ancak kullanıcı görsel bir fark bulmaz.


Bu ^ Yeni faaliyetlere nasıl başladıklarını anlayamıyorum ve kusursuz çalışıyor. Üzerinde çalışmak için büyük bir uygulama.
hitch.united

@ hitch.united Çok fazla parça ve sadece birkaç etkinlik kullandıkları için.
Joaquin Iurchuk

@ hitch.united muhtemelen etkinliğin animasyonunu geçersiz kılar overridePendingTransitions.
EpicPandaForce

sınıflandırma etkinlikleri yerine fragmanları yükleme nedir?
Vikas Pandey


8

Yani bu cevap birkaç yıl gecikti ama birisi bunu takdir edebilir. Android bize, çeşitli etkinliklerle bir gezinme çekmecesini kullanmayı kolaylaştıran yeni bir widget verdi.

android.support.design.widget.NavigationView modülerdir ve menü klasöründe kendi düzeni vardır. Bunu kullanma şekliniz xml mizanpajlarını şu şekilde sarmaktır:

  1. Kök Düzeni iki çocuk içeren bir android.support.v4.widget.DrawerLayout'tur: <include ... />kaydırılan düzen için (bkz. 2) ve bir 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, Navigasyon Çiziminizin başlığı için orientation = vertical olan bir LinearLayout'tur.

activity_main_drawer res / menu dizininizdeki bir xml menüsüdür. Seçtiğiniz öğeleri ve grupları içerebilir. AndroidStudio Galerisi'ni kullanırsanız, sihirbaz sizin için temel olanı yapar ve seçeneklerinizin ne olduğunu görebilirsiniz.

  1. Uygulama çubuğu düzeni günümüzde genellikle android.support.design.widget.CoordinatorLayout ve bu iki çocuk içerecektir: (a android.support.v7.widget.Toolbar içerir) bir android.support.design.widget.AppBarLayout ve <include ... >için gerçek içeriğiniz (bkz. 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. İçerik düzeni istediğiniz düzen olabilir. Bu, etkinliğin ana içeriğini içeren düzendir (gezinme çekmecesi veya uygulama çubuğu dahil değil).

Şimdi, tüm bunlarla ilgili harika şey, her bir etkinliği bu iki mizanpaja sarmanız, ancak NavigationView'ınızın (bkz. Adım 1) her zaman activity_main_drawer'ı (veya her neyse) göstermesini sağlamanızdır. Bu, tüm aktivitelerde aynı (*) Gezinme Çekmecesine sahip olacağınız anlamına gelir.

  • Aynı NavigationView örneği olmayacaklar, ancak adil olmak gerekirse, yukarıda özetlenen BaseActivity çözümü ile bile mümkün değildi.

stackoverflow, etrafındaki xml parantezlerinin bazılarını kesiyor, ancak önemli olan her şey var.
jwehrle

ama düğmeler gibi işlevleri nasıl değerlendiriyorsunuz? her aktivitede aynı kodu yazmalısınız?
Laur89

Evet, çünkü bunlar ayrı örneklerdir. Ancak, aktiviteleriniz için bu kodu bir kez genişletmek ve koymak için bir süper sınıf yapabilirsiniz.
jwehrle

@jwehrle faaliyetlerimiz için süper bir sınıf yapma hakkında bir örnek yazabilir misiniz?
CDrosos

public abstract class MyBaseActivity, AppCompatActivity'yi genişletir NavigationView.OnNavigationItemSelectedListener {// aşağıdakileri uygulayın: public boolean'ı geçersiz kıl onNavigationItemSelected (@NonNull MenuItem item) {}} genel sınıf MyActivity MyBaseActivity'yi genişletir {}
jwehrle

7

Bir grup etkinlik arasında ortak bir Gezinme çekmecesini yeniden kullanmanın en kolay yolu

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

Bu temel etkinliği kullanan bir etkinliğe örnek verebilir misiniz?
CDrosos

Aslında bu konuda herhangi bir ayrıntı hatırlayamıyorum, sadece uzanan AppBaseActivity ve setContentViewind varsayılan yolu çalışması gerektiğini düşünüyorum .
Levon Petrosyan

6

Orijinal posterin istediklerini yapmak isteyen herkes için, lütfen Kevin'in yerine söylediği gibi parçaları kullanmayı düşünün. İşte bunun nasıl yapılacağı ile ilgili mükemmel bir öğretici:

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

Bunun yerine fragmanlar yerine aktiviteleri kullanmayı seçerseniz, yeni bir aktiviteye her gittiğinizde nav çekmecesinin yeniden oluşturulması sorunuyla karşılaşırsınız. Bu, nav çekmecesinin her seferinde çirkin / yavaş bir şekilde işlenmesine neden olur.


5

Benim önerim: aktiviteleri hiç kullanmayın, bunun yerine parçaları kullanın ve bunları ilk parçanızı gösterdiğiniz kapta (örneğin Doğrusal Düzen) değiştirin.

Kod, Android Geliştirici Eğitimlerinde mevcuttur, sadece özelleştirmeniz gerekir.

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

Başvurunuzda gittikçe daha fazla parça kullanmanız ve uygulamanızda yalnızca dört temel etkinlik olması ve AndroidManifest.xml dosyasında harici olanlardan ayrı olarak belirtmeniz önerilir (örneğin, FacebookActivity):

  1. SplashActivity: fragman kullanmaz ve FullScreen temasını kullanır.

  2. LoginSignUpActivity: NavigationDrawer'a hiç gerek yok ve geri düğmesi de yok, bu yüzden normal araç çubuğunu kullanın, ancak en azından 3 veya 4 parça gerekli olacaktır. İşlem yok çubuğu teması kullanır

  3. HomeActivity veya DashBoard Etkinliği: İşlem çubuğu yok temasını kullanır. Burada Gezinme çekmecesine ihtiyacınız var, ayrıca takip eden tüm ekranlar, paylaşılan çekmeceyle yaprak görünümüne kadar parçalar veya iç içe parçalar olacaktır. Tüm ayarlar, kullanıcı profili vb. Bu aktivitede parçalar halinde olacaktır. Buradaki fragmanlar arka yığına eklenmeyecek ve çekmece menü öğelerinden açılacaktır. Çekmece yerine geri düğmesi gerektiren parçalarda, aşağıda dördüncü bir aktivite türü vardır.

  4. Çekmecesiz etkinlik. Bu etkinliğin üst kısmında bir geri düğmesi vardır ve içindeki parçalar aynı eylem çubuğunu paylaşır. Bu fragmanlar, bir navigasyon geçmişi olacağından, geri yığınına eklenecektir.

[Daha fazla yardım için bkz. Https://stackoverflow.com/a/51100507/787399 ]

Mutlu Kodlama !!


Bu eski bir gönderi. Her zaman bir etkinliğiniz olmasını sağlamak için fragmanları kullanabilirsiniz. Parçaları, kendisine ayrılmış bir kapta değiştirmeye devam edersiniz. Geriye doğru navigasyona ihtiyaç duyduğunuzda arka yığını koyun veya birincisi olarak gösterilecek bir parçaya ihtiyacınız olduğunda tüm parçaları açın.
Abhinav Saxena

@ Cabuxa.Mapache Daha fazla yardım almak için lütfen cevabımın ekindeki bağlantıyı kontrol edin. ActionBar ToolBar ve NavigatonDrawer ve ona bağlı tüm parçaları diğer bileşenleri paylaşmaya yardımcı ortak bir BaseActivity aldım.
Abhinav Saxena

1

bu kodu basastivitede güncelleyin. ve xml etkinliğine drawer_list_header eklemeyi unutmayın.

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

ve etkinliğinizde request () kullanmayın. ancak yine de çekmece resme tıklandığında görünmez .. ve sürükleyerek liste öğeleri olmadan görünür. çok denedim ama başarı yok. bunun için biraz antrenmana ihtiyacım var ...


1

@Kevin van Mierlo'nun cevabı ile, birkaç çekmece de uygulayabilirsiniz. Örneğin, sol tarafta (varsayılan) bulunan varsayılan menü ve sağ tarafta bulunan başka bir isteğe bağlı menü, yalnızca belirli fragmanlar yüklendiğinde gösterilir.

Bunu yapabildim.


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();







    }

bunu toolbar.xml dosyanız için kullanın

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

kullanmak istiyorsanız gezinme başlığı için bunu kullanın

<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

Kotlin'de şöyle yaparım:

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

Çekmece etkinlikleri bunu miras almalı BaseAppCompatActivity, super.onCreateiçerik ayarlandıktan sonra çağırmalı (aslında, bazı init yöntemine taşınabilir) ve düzenlerinde kimlikler için karşılık gelen öğelere sahip olmalıdır


Çözümünüzü denemek istedim ama şu hatayı alıyorum: "Bu Faaliyet zaten pencere dekoru tarafından sağlanan bir eylem çubuğuna sahip". 3 aktivite arasında geçiş yapmak istiyorum ve birbirlerinin kendi uygulama çubuğu var. Bunun mümkün olduğunu düşünüyor musunuz?
davoid

Bence, bu durumda eylem çubuğunu parçalara taşımalısın. Bizim app NoActionBar tema kullandık ve hatırladığım kadarıyla uyumluluk için araç çubuğu sağladı.
Pavlus

@Pavlus ikinci etkinlikte kod nasıl görünürdü? sınıf trackActivity: BaseAppCompatActivity () {?
Craig P

0

Cevabım sadece herhangi bir kaynak kodu olmayan kavramsal bir soru. Benim gibi bazı okuyucuların anlaması yararlı olabilir.

Bu, uygulamanızı nasıl mimari hale getirdiğinize ilişkin ilk yaklaşımınıza bağlıdır. Temel olarak iki yaklaşım vardır.

  1. Bir etkinlik (temel etkinlik) oluşturursunuz ve diğer tüm görünümler ve ekranlar parça olur. Bu temel etkinlik, Çekmece ve Koordinatör Düzenleri uygulamasını içerir. Aslında benim tercih ettiğim yöntem budur çünkü kendi kendine yeten küçük parçalara sahip olmak uygulama geliştirmeyi daha kolay ve pürüzsüz hale getirecektir.

  2. Uygulama geliştirme işleminizi her ekran için bir etkinlikle başlattıysanız, büyük olasılıkla temel etkinlik oluşturursunuz ve diğer tüm etkinlikler bu etkinlikten genişler. Temel faaliyet, çekmece ve koordinatör uygulaması için kod içerecektir. Çekmece uygulamasına ihtiyaç duyan herhangi bir faaliyet temel faaliyetten uzayabilir.

Şahsen herhangi bir organizasyon olmadan karışık parçaları ve etkinlikleri kullanmaktan kaçınmayı tercih ederim. Bu gelişmeyi daha zor hale getirir ve sonunda sıkışıp kalmanızı sağlar. Bunu yaptıysanız, kodunuzu yeniden düzenleyin.


-1

Parçayı kullanarak MainActivity'nizde Gezinme çekmecesi oluşturun.
MainActivity'de Gezinme Çekmecesini,
aynı Gezinme Çekmecesini kullanmak istediğiniz diğer tüm etkinliklerde şimdi başlatın. Sadece parçanızdaki android: name'i parçanızın Java dosyasına işaret ederek ayarlayın. Parçayı diğer Etkinliklerde başlatmanız gerekmeyecek.
Nav Çekmecesine Google Play Store uygulaması gibi diğer etkinliklerde hızlıca kaydırarak erişebilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.