20 Adımda Navigation Drawer Oluşturmak

1- Android Studio 4.0 sürümü içindeki projede res dizini altında menu dizini oluşturulur.

res -> new -> android resource directory ->

-directory name =menu
-resource type = menu

2- menu dizini altında resource file oluşturulur.

-menu -> new -> menu resource file
-menu name = nav_menu

3-menu içine item lar oluşturulur. code ya design kısmı kullanılarak.

4- oluşturduğumuz menu tasarımı sayfa tasarımına eklenir.

Bunu yapabilmek için activity_main.xml içinde, en altta bir drawerlayout a ihtiyaç var ama bu özellik design bölümüne henüz tanımlanmadığı için code kısmından Constraint Layout u DrawerLayout olarak değiştirip id sini belirliyoruz. Varsayılan olarak gelen Textview i de silelim.

5-DrawerLayout içine NavigationView eklenir.

-id si belirlenir (nav_drawer)
layout_width = wrap content
-menu = nav_manu
-android:layout_gravity=”start” (code kısmından)
-android:fitsSystemWindows=”true” (code kısmı için, bu özellik design dan da yapılabilir)

6-DrawerLayout içine ConstraintLayout eklenir.
-layout_width=match_parent
-layout_height=match_parent

7- varsayılan olarak gelen toolbar kaldırılır.

res -> values -> styles.xml

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>

8- constraintLayout içine paletten toolbar eklenir.
-sabitlenir.
-id belirlenir. (toolbar)

9- constraint layout içine framelayout eklenir.

-sabitlenir
-id belirlenir. (frame_fragments)

10-drawerlayout içine drawer için open değeri verilir. (code kısmından)

tools:openDrawer="start" 

11- MainActivity.java dosyasında NavigationView, DrawerLeyout Toolbar tanımlanır.

private NavigationView nav_view;
private DrawerLayout drawer;
private Toolbar toolbar; 

12- onCreate metodu içerisinde tanımlanan nesneler bağlanır.

nav_view = findViewById(R.id.nav_view);
drawer = findViewById(R.id.drawer);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

13- drawable üzerinde bir toggle oluşturulup drawer üzerinde senkronize çalıştırılır.

ActionBarDrawerToggle toogle =
new ActionBarDrawerToggle(this, drawer, toolbar, 0,0);
drawer.addDrawerListener(toogle);
toogle.syncState();

14- Geri tuşuna basıldığında uygulamadan hemen çıkmak yerine, açıksa navigationdrawer ın kapanması sağlanır.

-MainActivity de onBackPressed metodu oluşturulup, ilgili kodlar girilir.

@Override
public void onBackPressed() {
if(drawer.isDrawerOpen(GravityCompat.START))
{
drawer.closeDrawer(GravityCompat.START);
}
else
{
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}

15- Drawer menu item larına tıklanılma özelliği verilir.

-NavigationView.OnNavigationItemSelectedListener MainActivity e implement edilir.
-bu implement için ilgili onNavigationItemSelected metodu aktifleştirilir.
-bu metodun tetiklenebilmesi için onCreate metodu içine nav_view.setNavigationItemSelectedListener(this); girilir.
-onNavigationItemSelected içine tıklanıldığında ileti göstermesi için getItemId için tanımlamalar ve tıklanıldığında drawer ın kapanması için ilgili kodlar girilir.

   @Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
if(item.getItemId() == R.id.action_first) {
       Toast.makeText(getApplicationContext(), "First item was touched", Toast.LENGTH_SHORT).show();
   }
   if(item.getItemId() == R.id.action_second) {
       Toast.makeText(getApplicationContext(), "Second item was touched", Toast.LENGTH_SHORT).show();
   }
   if(item.getItemId() == R.id.action_third) {
       Toast.makeText(getApplicationContext(), "Third item was touched", Toast.LENGTH_SHORT).show();
   }
    drawer.closeDrawer(GravityCompat.START);
   return true;
}

16- NavigationDrawer üzerinde fragment görüntüleyebilmek için fragment sınıf ve layout dosyaları oluşturulur ve fragment java dosyaları içinde onCreateView metodu haricindeki tanımlamalar temizlenir. fragment layout dosyalarının farkedilebilir olmaları için textview atanıp hangi fragment olduğu yazılır, ayrıca layoutlar içinde varsayılan olarak gelen framelayout yerine constraintlayout da kullanılabilir.

-proje paketi üzerinde sağ tık -> new -> fragments -> Fragment(Blank)

17- Oluşturulan fragmentlar MainActivity e bağlanır.

– MainActivity içinde Fragment nesnesi tanımlanır.

private Fragment fragment; (andoridx kütüphanesi olması önemli ) 

-Main activity içinde fragment nesnesi içine uygulama açıldığında görünmesi istenilen varsayılan fragment tanımlanır:

fragment = new FirstFragment(); getSupportFragmentManager().beginTransaction().replace(R.id.frame_fragments, fragment).commit(); 

-Fragment tanımlamaları onNavigationItemSelected metodu içindeki if blokları arasına ilgili fragment lara göre düzenlenerek toast mesajın altına girilir.

fragment = new FragmentFirst(); 
getSupportFragmentManager().beginTransaction().replace(R.id.frame_fragments, fragment).commit();  

fragment = new FragmentSecond();
 getSupportFragmentManager().beginTransaction().replace(R.id.frame_fragments, fragment).commit(); 

fragment = new FragmentThird(); 
getSupportFragmentManager().beginTransaction().replace(R.id.frame_fragments, fragment).commit();

18- Navigation Drawer için başlık oluşturulur. Bunun için önce başlık tasarımı yapılır .
-res-> layout -> new -> Layout Resource File (nav_drawer_head)
-constraint layout için yükseklik (200dp), arkaplan(#E91E63) değerleri belirlenir.
-constraint içine textview eklenerek istenilen başlık ismi girilir. id si belirlenir. hizalamaları yapılır. boyutu vs ayarlanır.

19- MainActivity de onCreate metodu içinde bağlama işlemi yapılır.

View header = nav_view.inflateHeaderView(R.layout.nav_drawer_head);

20- Proje Run edilir.