Android でナビゲーション ドロワーを使用することは可能ですが、フラグメントを更新する代わりに、アプリ内のナビゲーション手段としてアクティビティを切り替えたいと考えています。
5 に答える
はい、可能です - それは私が自分のアプリで行ったことです。すでに多くのアクティビティを設定していましたが、それらすべてをフラグメントに変換するのではなく、ナビゲーション ドロワーを調整してすべてのアクティビティで機能するようにしたいと考えました。残念ながら、これは簡単な回避策ではないため、フラグメントを使用するオプションがあれば、それを使用します。しかし、私がそれをした方法は次のとおりです。
2 つのアクティビティがあり、どちらも Navigation Drawer が必要だとします。それぞれの layout.xml で、ナビゲーション オプションを保持DrawerLayout
する適切なを指定しました。ListView
基本的に、ナビゲーション ドロワーは、アクティビティを切り替えるたびに作成され、持続しているように見えます。作業をより簡単にするために、ナビゲーション ドロワーのセットアップに必要な一般的なメソッドを独自のクラスに配置しましたNavigationDrawerSetup.java
。そうすれば、アクティビティで同じカスタム アダプターなどを使用できます。
このNavigationDrawerSetup.java
クラスには、次のものがあります。
configureDrawer()
ActionBar
- これにより、 、ActionBarDrawerToggle
、および必要なリスナーが設定されます- カスタム配列アダプター (リスト内のナビゲーション オプションを設定するため)
selectOptions()
ドロワー項目のクリックを処理するメソッド
アクティビティの 1 つにナビゲーション ドロワーを設定するときは、新しいNavigationDrawerSetup
オブジェクトを作成し、必要なレイアウト パラメータ ( など) を渡すDrawerLayout
だけですListView
。次に、次のように呼び出しますconfigureDrawer()
。
navigationDrawer = new NavigationDrawerSetup(mDrawerView, mDrawerLayout,
mDrawerList, actionBar, mNavOptions, currentActivity);
navigationDrawer.configureDrawer();
currentActivity
ナビゲーション ドロワーは現在のアクティビティに関連付けられているため、渡されます。をセットアップするときに使用する必要がありますActionBarDrawerToggle
。
mDrawerToggle = new ActionBarDrawerToggle(currentActivity, // host Activity
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
)
currentActivity
カスタムをセットアップするときにも使用する必要がありAdapter
ます。
ナビゲーション ドロワーを介してアクティビティを切り替える方法については、selectItem() メソッド内で新しいインテントを設定するだけです。
private void selectItem(int position) {
// Handle Navigation Options
Intent intent;
switch (position) {
case 0:
intent = new Intent(currentActivity, NewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
currentActivity.startActivity(intent);
break;
case 1:
// etc.
}
新しいものActivity
にもナビゲーションドロワーが設定されており、表示されることを確認してください。
このメソッドを独自のニーズに合わせてカスタマイズするためにできることはたくさんありますが、これは私が行った方法の一般的な構造です。お役に立てれば!
BaseDrawerActivity
Navigation Drawer を実装し、Navigation Drawer が必要な各アクティビティで を拡張する必要BaseDrawerActivity
があります。
最初の作成BaseDrawerActivity.java
:
public class BaseDrawerActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{
DrawerLayout drawerLayout;
Toolbar toolbar;
FrameLayout frameLayout;
NavigationView navigationView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_base_drawer);;
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
frameLayout = (FrameLayout) findViewById(R.id.content_frame);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawerLayout.setDrawerListener(toggle);
toggle.syncState();
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}
@Override
public void onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
//to prevent current item select over and over
if (item.isChecked()){
drawerLayout.closeDrawer(GravityCompat.START);
return false;
}
if (id == R.id.nav_camera) {
// Handle the camera action
startActivity(new Intent(getApplicationContext(), CameraActivity.class));
} else if (id == R.id.nav_gallery) {
startActivity(new Intent(getApplicationContext(), GalleryActivity.class));
} else if (id == R.id.nav_slideshow) {
startActivity(new Intent(getApplicationContext(), SlideshowActivity.class));
} else if (id == R.id.nav_manage) {
startActivity(new Intent(getApplicationContext(), ManageActivity.class));
} else if (id == R.id.nav_share) {
startActivity(new Intent(getApplicationContext(), ShareActivity.class));
} else if (id == R.id.nav_send) {
startActivity(new Intent(getApplicationContext(), SendActivity.class));
}
drawerLayout.closeDrawer(GravityCompat.START);
return true;
}
}
次にフォルダに作成activity_base_drawer.xml
しres/layout
ます:
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:openDrawer="start">
<include layout="@layout/app_bar_home"/>
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header_home"
app:menu="@menu/activity_home_drawer" />
</android.support.v4.widget.DrawerLayout>
どこに@layout/app_bar_home
ある:
<?xml version="1.0" encoding="utf-8"?>
<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"
android:fitsSystemWindows="true">
<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>
<FrameLayout android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.design.widget.CoordinatorLayout>
次に、次のようなナビゲーション ドロワーを持つアクティビティを入力しますCameraActivity.java
。
public class CameraActivity extends BaseDrawerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLayoutInflater().inflate(R.layout.activity_camera, frameLayout);
/**
* Setting title
*/
setTitle("Camera");
}
@Override
protected void onResume() {
super.onResume();
// to check current activity in the navigation drawer
navigationView.getMenu().getItem(0).setChecked(true);
}
}
R.layout.activity_camera
のレイアウトはどこにありますかCameraActivity.java
。
GalleryActivity.java
次に、Navigation Drawer を持つ他のアクティビティなどを作成します。
public class GalleryActivity extends BaseDrawerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLayoutInflater().inflate(R.layout.activity_gallery, frameLayout);
// Setting title
setTitle("Gallery");
}
@Override
protected void onResume() {
super.onResume();
navigationView.getMenu().getItem(1).setChecked(true);
}
}
Fragment manager は、投稿に記載されているように置き換えることができます:
https://guides.codepath.com/android/fragment-navigation-drawer#alternative-to-fragments
フラグメント マネージャーを使用する代わりに、レイアウトをインフレートできます。