Navigation Drawer Menu ๊ตฌํ
[2020-07-12]
์ฌํ๊น์ง๋ ๋ฉ๋ด๊ฐ ์์์ ๋์ค๊ณ ๋ซํ๋ ๊ฒ๋ง ๊ฐ๋ฅํ๊ณ
๋ฒํผ์ ๋๋ฅด๋ฉด ํด๋ฆญ๋ง ๋ ๋ฟ ์๋ฌด๊ฒ๋ ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ๋์ fragment๋ฅผ ์ฌ์ฉํด ๊ฐ ํญ๋ชฉ์ ๋๋ฅผ ๋๋ง๋ค ํด๋น ํ์ด์ง๋ก ์ด๋ํ ์ ์๋๋ก ํด๋ณด์๋ค.
#02. fragment๋ฅผ ์ด์ฉํด ํญ๋ชฉ ํด๋ฆญ์ ๊ฐ ํ์ด์ง๋ก ์ด๋ํ๋๋ก ์ค์
๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํ๊ธฐ ์ ์ fragment์ ๊ฐ๋ ์ ๋ํด ๋ช ๊ฐ์ง ์ดํด๋ณด์๋๋ฐ
๋ถํ ๋ ํ๋ฉด๋ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ์ฑํ๊ณ ,
ํ๋ฉด๋ค์ ๊ฐ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก
์กํฐ๋นํฐ์ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ณ ์ญ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ UI ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค.
- layout/fragment_home.xml, fragment_remote.xml, fragment_addremote.xml, fragment_explain.xml, fragment-settings.xml (๊ฐ ํ์ด์ง ํ๋ฉด)
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
tools:context=".HomeFragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/home" // ๊ฐ ํญ๋ชฉ๋ง๋ค ํ
์คํธ๋ ๋ณ๊ฒฝํด ์ฃผ์๋ค.
android:layout_gravity="center"
android:textSize="20sp"/>
</FrameLayout>
๊ฐ ํญ๋ชฉ์ ํ์ผ์ ์ถ๊ฐํด FrameLayout ํ์์ผ๋ก ์ ๋ ฅํด ์ฃผ์๋ค.
- navigation/main.xml
<?xml version="1.0" encoding="utf-8"?>
<navigation 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/main"
app:startDestination="@id/nav_home">
<fragment
android:id="@+id/nav_home"
android:name="com.example.smartfan.HomeFragment"
android:label="Home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/nav_remote"
android:name="com.example.smartfan.RemoteFragment"
android:label="Remote"
tools:layout="@layout/fragment_remote" />
<fragment
android:id="@+id/nav_addremote"
android:name="com.example.smartfan.AddremoteFragment"
android:label="Addremote"
tools:layout="@layout/fragment_addremote" />
<fragment
android:id="@+id/nav_explain"
android:name="com.example.smartfan.ExplainFragment"
android:label="Explain"
tools:layout="@layout/fragment_explain" />
<fragment
android:id="@+id/nav_settings"
android:name="com.example.smartfan.SettingsFragment"
android:label="Settings"
tools:layout="@layout/fragment_settings" />
</navigation>
ํ์ผ์ ์ถ๊ฐํด ๊ฐ fragment์ id์ ๋ผ๋ฒจ์ ์ ๋ ฅํด ๊ตฌ๋ณํ ์ ์๋๋ก ํ์์ผ๋ฉฐ
๋๊ตฌ์ ๊ฐ ํญ๋ชฉ์ ๋ง๋ ๋ ์ด์์์ ์ฐ๊ฒฐํด ์ฃผ์๋ค.
- layout/activity_main.xml
<LinearLayout
android:id="@+id/layoutToolBar" //id ์ถ๊ฐ
android:layout_width="match_parent"
android:layout_height="?actionBarSize"
android:background="@color/colorPrimary"
……
</LinearLayout>
<fragment // fragment ๋ด์ฉ ์ถ๊ฐ
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/layoutToolBar"
app:layout_constraintBottom_toBottomOf="parent"
android:id="@+id/navHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:navGraph="@navigation/main"
/>
๊ธฐ์กด์ ์ ๋ ฅํ ๋ด์ฉ์์ LinearLayout์ id์
fragment ๋ด์ฉ์ ์ถ๊ฐํด ์์ ์ ์ ๋ ฅํ ์ ๋ ฅํ ๊ฐ ํ์ด์ง๋ค์ด
ํญ๋ชฉ๋ค์ ํด๋ฆญํ ๋๋ง๋ค ๋น์น ์ ์๊ฒ ํ๋ฉด์ ๊ตฌ์ฑํด ์ค๋ค.
- SettingsFragment.java, RemoteFragment.java, HomeFragment.java, ExplainFragment.java, AddremoteFragment.java (๊ฐ ํ์ด์ง ํ๋ฉด)
package com.example.smartfan;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class HomeFragment extends Fragment {
public HomeFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_home, container, false);
}
}
๊ฐ ํ์ด์ง ํ๋ฉด์ fragment๊ฐ ํธ์ถ๋ ์ ์๋๋ก ์ค์ ํด์ฃผ์๋ค.
- MainActivity.java
package com.example.smartfan;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.navigation.NavController;
import androidx.navigation.NavDestination;
import androidx.navigation.Navigation;
import androidx.navigation.ui.NavigationUI;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.google.android.material.navigation.NavigationView;
……
NavigationView navigationView = findViewById(R.id.navigationView);
navigationView.setItemIconTintList(null);
NavController navController = Navigation.findNavController(this, R.id.navHostFragment);
NavigationUI.setupWithNavController(navigationView, navController);
final TextView textTitle = findViewById(R.id.textTitle);
navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
@Override
public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
textTitle.setText(destination.getLabel());
}
});
}
}
๋ฒํผ์ ๋๋ ์ ๋ ํ๋ฉด์ ๋ณ๊ฒฝํด ์ค ์ ์๋๋ก Navigation Controller์
ํ๋ฉด์ ํด๋ฆญํ ๋๋ง๋ค ํ๋ฉด์ ๋ง๋ ํ์ดํ๋ก ํด๋ฐ์ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ค ์ ์๋๋ก ํด์ฃผ์๋ค.
์ ๋ฎฌ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด ํ์ธํด ๋ณด๋ฉด
๋ฉ๋ด์ ์๋ ๊ฐ ํญ๋ชฉ๋ค์ ํด๋ฆญํ๋ฉด ๊ฐ ํ์ด์ง๋ก ๋์ด๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ฐ ํญ๋ชฉ๋ค์ ๋๋ฌ ํด๋นํญ๋ชฉ์ ํ์ด์ง๊น์ง ๋์ด๊ฐ๋ ๊ฒ์ ์งํํ์๋ค.
์ด์ ์ด ๊ฐ ํ์ด์ง๋ค์ ๋์์ธํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํด์ผ๊ฒ ๋ค.
๋๊ธ