简体   繁体   English

在Android Studio的默认导航抽屉模板中使用按钮在片段之间切换

[英]Switching between fragments with a button in default Navigation Drawer template of Android Studio

I'm using default Navigation Drawer in Android Studio, and I added two fragments for first two button in navigation drawer. 我在Android Studio中使用默认的导航抽屉,并且为导航抽屉中的前两个按钮添加了两个片段。 Everything works fine and I can switch between these fragments from drawer menu. 一切正常,我可以在抽屉菜单中的这些片段之间进行切换。

But I want to have a simple button in first fragment that clicking on it take me to second fragment. 但我想在第一个片段中有一个简单的按钮,单击它会将我带到第二个片段。 Clicking on such button opens second fragment but it seems to overlap whole screen and disappear the navigation view. 单击此按钮可打开第二个片段,但它似乎覆盖了整个屏幕,并消失了导航视图。

These are my project's codes: 这些是我项目的代码:

MainActivity.java : MainActivity.java:

package com.example.arantik.test4;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

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

        Fragment fragment=null;

        if (id == R.id.nav_camera) {
            fragment=new Fragment_1();
        } else if (id == R.id.nav_gallery) {
            fragment=new Fragment_2();
        }

        android.support.v4.app.FragmentTransaction transaction=getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.mainFrame, fragment);
        transaction.addToBackStack(null);
        transaction.commit();

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

activity_main.xml : activity_main.xml:

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

</android.support.v4.widget.DrawerLayout>

content_main.xml : content_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.example.arantik.test4.MainActivity"
    tools:showIn="@layout/app_bar_main">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/mainFrame">
    </FrameLayout>

</android.support.constraint.ConstraintLayout>

Fragment_1.java : Fragment_1.java:

package com.example.arantik.test4;

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class Fragment_1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view=inflater.inflate(R.layout.fragment_1_layout, container, false);

        Button button=(Button)view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
                android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                Fragment_2 fragment_2=new Fragment_2();
                fragmentTransaction.replace(android.R.id.content, fragment_2);
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }
        });
        return view;
    }
}

fragmen_1_layout.xml : fragmen_1_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:text="First Fragment"
        android:textSize="20sp"/>
    <Button
        android:layout_width="100dp"
        android:layout_height="60dp"
        android:id="@+id/button"
        android:text="click"/>

</LinearLayout>

Fragment_2.java : Fragment_2.java:

package com.example.arantik.test4;

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment_2 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view=inflater.inflate(R.layout.fragment_2_layout, container, false);
        return view;
    }
}

fragmen_2_layout.xml : fragmen_2_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#00ff00">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:text="Second Fragment"
        android:textSize="20sp"/>

</LinearLayout>

I've not changed other Java or XML codes. 我没有更改其他Java或XML代码。

Add a public method to MainActivity , cast getActivity() to MainActivity in your fragment, and then you can invoke the method. MainActivity添加一个公共方法,在片段中将getActivity() MainActivityMainActivity ,然后可以调用该方法。 You can also use interface , refer Communicating with Other Fragments 您还可以使用interface与其他片段进行通信

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在默认Android Studio导航抽屉中的片段之间切换 - How to switch between Fragments in default Android Studio Navigation Drawer 替换默认 Android Studio 导航抽屉中的片段 - Replace fragments in default Android Studio navigation drawer 在新的导航抽屉活动模板中使用onNavigationItemSelected在片段之间切换(Android Studio 1.4以后) - Switch between Fragments with onNavigationItemSelected in new Navigation Drawer Activity template (Android Studio 1.4 onward) 在活动和片段之间切换 - Switching between activities and fragments in navigation drawer 导航抽屉 android 切换片段? - Navigation drawer android switching betveen fragments? 在导航抽屉中切换片段 - Switching fragments in navigation drawer 我的导航栏没有在 Android Studio Kotlin 中的片段之间切换 - My Navigation bar is not switching between fragments in Android Studio Kotlin 使用片段时,在Android导航抽屉图像和向上插入符之间切换 - Switching between Android Navigation Drawer image and Up caret when using fragments 在 Android Studio 默认模板中更改导航抽屉图标的颜色 - Change color of Navigation Drawer Icon in Android Studio default template Android Studio Navigation Drawer 片段重叠 - Android Studio Navigation Drawer fragments overlapping
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM