web-dev-qa-db-ja.com

Androidフラグメントまたはアクティビティを含むスタジオナビゲーションドロワー

Android Studioのナビゲーションドロワーテンプレートを使用してアプリケーションを開発しようとしています。そこで、このテンプレートを使用して新しいプロジェクトを作成しました。しかし、プログラムを実行してメニュー項目をクリックすると、ビューは変わりません。インターネットでどこでも検索しましたが、これをどのように処理できるかわかりませんでした。

これはAndroid Studio:

 public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.

    int id = item.getItemId();

    if (id == R.id.nav_camara) {


    } else if (id == R.id.nav_gallery) {

    } else if (id == R.id.nav_slideshow) {

    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

私が達成したいのは、現在のビューを、クリックされたメニュー項目の適切なビューに置き換えることです。

Fragmentはこれを行うための最良の方法ですか、それともメニュー項目ごとに異なるアクティビティを作成する必要がありますか?

5
Royken

あなたの場合、フラグメントを追加することが最善の解決策になります。

フラグメントBlankFragment.Javaを作成します

public class BlankFragment extends Fragment {

    public BlankFragment() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_blank, container, false);
    }

}

そしてfragment_black.xmlを作成します

    <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="com.above_inc.shyam.drawer.BlankFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:text="@string/hello_blank_fragment" />

</FrameLayout>

今あなたの方法を置き換えます

public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    Fragment fragment = null;
    if (id == R.id.nav_camera) {
        // Handle the camera action
        fragment = new BlankFragment();
    } else if (id == R.id.nav_gallery) {

    } else if (id == R.id.nav_slideshow) {

    } else if (id == R.id.nav_manage) {

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

    }
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;

}

content_main.xmlに以下のコードを追加します

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    Android:paddingLeft="@dimen/activity_horizontal_margin"
    Android:paddingRight="@dimen/activity_horizontal_margin"
    Android:paddingTop="@dimen/activity_vertical_margin"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.above_inc.shyam.drawer.MainActivity"
    tools:showIn="@layout/app_bar_main">


    <FrameLayout
        Android:id="@+id/frame_container"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        />
</RelativeLayout>

上記のコードのカメラと同じ他のオプションにフラグメントを追加することもできます

21
Ghanshyam Nayma

メニュー項目をクリックしたときにナビゲーションドロワーを次の画面に表示する場合は、フラグメントが最適な方法です。

アクティビティを使用する場合、Navigation Drawerを拡張してどこでも使用するBaseActivityを作成しない限り、NavigationDrawerは表示されません。この場合、メニューをクリックすると新しいアクティビティがポップアップするため、アクティビティ遷移アニメーションも変更する必要があります。これは奇妙に見える場合があります。

2
Passiondroid

プロジェクトを右クリック->新規->フラグメント。

それに応じてスイッチケースを編集します。

0
Uday

@ Passiondroid'sanswer すべてのアクティビティにわたるナビゲーションドロワーが必要な場合にのみフラグメントを使用する場合。

メニュー項目をクリックしてアクティビティを開始することについて、私のアプリの1つで、私はこれに従います、

public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        switch(id)
        {

            case R.id.nav_profile:
            selection = 1;
                intent = new Intent("Android.intent.action.WEB");
                intent.putExtra("selection",selection);
                startActivity(intent);
                break;
            case R.id.nav_books:
                intent = new Intent("Android.intent.action.WEBD");
                selection = 2;
                intent.putExtra("selection",selection);
                startActivity(intent);
                break;
            case R.id.fav_quotes:
                intent = new Intent ("Android.intent.action.SHOWFAVTES");
                selection = 3;
                intent.putExtra("selection",selection);
                startActivity(intent);
                break;
             default:
                break;
        }

メニュー項目を変更および構成するには、res-> Menuの下に「activity_main_drawer.xml」があります。

また、各メニュー項目をクリックすると、ご希望に応じてアクティビティを開始できます。使用する前に、AndroidManifest.xmlファイルでアクティビティを宣言しました。

0
Natarajan Raman

enter image description here

Android studio> 3.5から、ナビゲーションドロワーアクティビティを作成すると、ドロワーアイテムがクリックされたときにフラグメントが開くことがわかります。

アクティビティを開きたい場合は、リスナーにすることができます。

 mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow,
            R.id.nav_tools, R.id.nav_share, R.id.nav_send,R.id.nav_accounts)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_Host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);


    navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {

            int menuId = destination.getId();

            switch (menuId){
                case R.id.nav_gallery:
                    Toast.makeText(MainActivity.this,"You tapped gallery",Toast.LENGTH_LONG).show();
                    fab.hide();

                    break;
                    default:
                        fab.show();
                        break;
            }

        }
    });

完全なチュートリアルについては。 ナビゲーションドロワー

0
Richard Kamere