从一个Activity跳转到另一个Activity的指定Fragment,附底部菜单栏的实现

这篇具有很好参考价值的文章主要介绍了从一个Activity跳转到另一个Activity的指定Fragment,附底部菜单栏的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先实现底部菜单栏

这部分参考B站视频Springboot:
2022最新版】Android Studio 安装 Android(安卓)开发零基础入门到精通全套教程P118-119
效果图:activity界面返回到fragment页面,android,ui,android studio

  • 忘了需不需要添加依赖了,大概率是本来就有不用添加,但还是把可能有关的依赖先贴上来
    implementation 'androidx.navigation:navigation-fragment:2.3.5'
    implementation 'androidx.navigation:navigation-ui:2.3.5'
  • 先在res下的menu包里(没有就建一个menu包)新建一个buttom_nav_menu的资源文件(xml文件),代码为:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/bottom_home"
        android:title="@string/bottom_title_home"
        android:icon="@drawable/home"/>
    <item
        android:id="@+id/bottom_notice"
        android:title="@string/bottom_title_notice"
        android:icon="@drawable/notice"
    />
    <item
        android:id="@+id/bottom_mine"
        android:title="@string/bottom_title_mine"
        android:icon="@drawable/person"/>
    <item
        android:id="@+id/bottom_unfold"
        android:title="@string/bottom_title_unfold"
        android:icon="@drawable/more"
        />

</menu>
  • 然后在HomeActivity的基础上创建四个对应的fragment文件
  • 然后HomeActivity里的代码
package com.example.academymanageapp.ui;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.content.ClipData;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.MenuItem;

import com.example.academymanageapp.R;
import com.example.academymanageapp.ui.base.BaseActivity;
import com.example.academymanageapp.ui.home.HomeFragment;
import com.example.academymanageapp.ui.mine.MineFragment;
import com.example.academymanageapp.ui.notice.NoticeFragment;
import com.example.academymanageapp.ui.unfold.UnfoldFragment;
import com.google.android.material.bottomnavigation.BottomNavigationView;

public class HomeActivity extends BaseActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

    private Fragment[] fragments; //fragment数组,用来存储底部菜单栏用到的fragment
    private int lastFragmentIndex = 0;//切换前的fragment
    private int nextFragmentIndex;//切换后的fragment
    private int fragmentFlag;

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

    }

    @Override
    protected void initViews() {

        //初始化fragments
        fragments = new Fragment[]{new HomeFragment(),new NoticeFragment(), new MineFragment(),new UnfoldFragment()};
        //注册一个监听,用来监听用户点击底部菜单里的哪一个fragment
        BottomNavigationView bottomNavigationView = find(R.id.main_bottom_navigation);
        
        //设置默认的
        getSupportFragmentManager().beginTransaction().add(R.id.main_frame,fragments[0]).commit();
    }


    @Override
    protected int getLayoutId() {
        return R.layout.activity_home;
    }

    @Override
    //获得用户点击的menuItem
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
//        item.getItemId();//获得用户点击的部件的Id
        item.setChecked(true);//给点中的item设置checked
        switch (item.getItemId()){
            case R.id.bottom_home:
                switchFragment(0);
                break;
            case R.id.bottom_notice:
                switchFragment(1);
                break;
            case R.id.bottom_mine:
                switchFragment(2);
                break;
            case R.id.bottom_unfold:
                switchFragment(3);
                break;
        }
        return false;
    }

    //默认点击是home,所以要创建一个fragment的切换
    private void switchFragment(int to){
        if (lastFragmentIndex == to){ //如果切换前后一致则不切换
            return;
        }
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        //如果没有添加过,则添加对应的fragment
        if (!fragments[to].isAdded()){
            fragmentTransaction.add(R.id.main_frame,fragments[to]);
        }else {
            fragmentTransaction.show(fragments[to]);//否则就展示出来
        }
        //添加后将之前的隐藏
        fragmentTransaction.hide(fragments[lastFragmentIndex]).commitAllowingStateLoss();
        lastFragmentIndex = to;
    }

}
  • fragment里的代码:
package com.example.academymanageapp.ui.mine;

import android.view.View;
import androidx.core.content.ContextCompat;
import com.example.academymanageapp.R;
import com.example.academymanageapp.databinding.FragmentMineBinding;
import com.example.academymanageapp.ui.base.BaseFragment;

public class MineFragment extends BaseFragment {
    private FragmentMineBinding binding;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = FragmentMineBinding.inflate(inflater, container, false);
        View root = binding.getRoot();
        return root;
        }
        
    @Override
    protected void initViews() {
    }

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_mine;
    }
}

其他fragment同理

实现跳转

参考文章:android 如何从activity跳转到另一个activity下指定的fragment

问题描述:在做毕设的时候,需要实现点击返回按钮时从activityA(即ActivityDetailActivity)返回到进入前的界面(可能是fragmentA(即homeFragment),也有可能是fragmentB(即mineFragment),两者都属于HomeActivity)。

思路:从ActivityDetailActivity跳转时,带flag跳转,根据flag跳转到指定的fragment

ActivityDetailActivity部分的代码:

 Intent intent = new Intent();
 intent.setClass(ActivityDetailActivity.this,HomeActivity.class);
 intent.putExtra("fragment_flag",2);
 startActivity(intent);

HomeActivity部分只需要对传回来的值进行一个判断,根据值switch到指定的fragment就好,添加的代码:

fragmentFlag = getIntent().getIntExtra("fragment_flag",0);
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        switch (fragmentFlag){
            case 0:
                switchFragment(0);
                //使对应的底部菜单栏的Item处于被点击的状态(即点击都更改颜色)
                bottomNavigationView.setSelectedItemId(R.id.bottom_home);
                //调用底部菜单栏函数,以实现根据点击底部菜单栏实现fragment的跳转
                bottomNavigationView.setOnNavigationItemSelectedListener(this);
                //记得加break,否则页面不会变化
                break;
            case 1:
                switchFragment(1);
                bottomNavigationView.setSelectedItemId(R.id.bottom_notice);
                bottomNavigationView.setOnNavigationItemSelectedListener(this);
                break;
            case 2:
                switchFragment(2);
                bottomNavigationView.setSelectedItemId(R.id.bottom_mine);
                bottomNavigationView.setOnNavigationItemSelectedListener(this);
                break;
            case 3:
                switchFragment(3);
                bottomNavigationView.setSelectedItemId(R.id.bottom_unfold);
                bottomNavigationView.setOnNavigationItemSelectedListener(this);
                break;
        }
        transaction.commit();

此时HomeActivity的完整代码是:文章来源地址https://www.toymoban.com/news/detail-771345.html

package com.example.academymanageapp.ui;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import android.content.ClipData;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.MenuItem;

import com.example.academymanageapp.R;
import com.example.academymanageapp.ui.base.BaseActivity;
import com.example.academymanageapp.ui.home.HomeFragment;
import com.example.academymanageapp.ui.mine.MineFragment;
import com.example.academymanageapp.ui.notice.NoticeFragment;
import com.example.academymanageapp.ui.unfold.UnfoldFragment;
import com.google.android.material.bottomnavigation.BottomNavigationView;

public class HomeActivity extends BaseActivity implements BottomNavigationView.OnNavigationItemSelectedListener {

    private Fragment[] fragments; //fragment数组,用来存储底部菜单栏用到的fragment
    private int lastFragmentIndex = 0;//切换前的fragment
    private int nextFragmentIndex;//切换后的fragment
    private int fragmentFlag;

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

    }

    @Override
    protected void initViews() {

        //初始化fragments
        fragments = new Fragment[]{new HomeFragment(),new NoticeFragment(), new MineFragment(),new UnfoldFragment()};
        //注册一个监听,用来监听用户点击底部菜单里的哪一个fragment
        BottomNavigationView bottomNavigationView = find(R.id.main_bottom_navigation);

        fragmentFlag = getIntent().getIntExtra("fragment_flag",0);
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        switch (fragmentFlag){
            case 0:
                switchFragment(0);
                //使对应的底部菜单栏的Item处于被点击的状态(即点击都更改颜色)
                bottomNavigationView.setSelectedItemId(R.id.bottom_home);
                //调用底部菜单栏函数,以实现根据点击底部菜单栏实现fragment的跳转
                bottomNavigationView.setOnNavigationItemSelectedListener(this);
                //记得加break,否则页面不会变化
                break;
            case 1:
                switchFragment(1);
                bottomNavigationView.setSelectedItemId(R.id.bottom_notice);
                bottomNavigationView.setOnNavigationItemSelectedListener(this);
                break;
            case 2:
                switchFragment(2);
                bottomNavigationView.setSelectedItemId(R.id.bottom_mine);
                bottomNavigationView.setOnNavigationItemSelectedListener(this);
                break;
            case 3:
                switchFragment(3);
                bottomNavigationView.setSelectedItemId(R.id.bottom_unfold);
                bottomNavigationView.setOnNavigationItemSelectedListener(this);
                break;
        }
        transaction.commit();

        //设置默认的
        getSupportFragmentManager().beginTransaction().add(R.id.main_frame,fragments[0]).commit();
    }


    @Override
    protected int getLayoutId() {
        return R.layout.activity_home;
    }

    @Override
    //获得用户点击的menuItem
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
//        item.getItemId();//获得用户点击的部件的Id
        item.setChecked(true);//给点中的item设置checked
        switch (item.getItemId()){
            case R.id.bottom_home:
                switchFragment(0);
                break;
            case R.id.bottom_notice:
                switchFragment(1);
                break;
            case R.id.bottom_mine:
                switchFragment(2);
                break;
            case R.id.bottom_unfold:
                switchFragment(3);
                break;
        }
        return false;
    }

    //默认点击是home,所以要创建一个fragment的切换
    private void switchFragment(int to){
        if (lastFragmentIndex == to){ //如果切换前后一致则不切换
            return;
        }
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        //如果没有添加过,则添加对应的fragment
        if (!fragments[to].isAdded()){
            fragmentTransaction.add(R.id.main_frame,fragments[to]);
        }else {
            fragmentTransaction.show(fragments[to]);//否则就展示出来
        }
        //添加后将之前的隐藏
        fragmentTransaction.hide(fragments[lastFragmentIndex]).commitAllowingStateLoss();
        lastFragmentIndex = to;
    }

}

到了这里,关于从一个Activity跳转到另一个Activity的指定Fragment,附底部菜单栏的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android:单Activity多Fragment,Navigation实现Fragment跳转,Fragment之间通过ViewModel共享数据

    1、activity_main.xml 2、MainActivity FragmentA:包括SeekBar和一个按钮,点击button跳转到FragmentB FragmentB:SeekBar加一和减一操作的按钮,一个返回FragmentA的按钮,即经过加减操作以后,在FragmentA上显示加减的结果。 nav_graph.xml 1、fragment_home.xml 2、HomeFragment 1、fragment_detail.xml 2、DetailFragm

    2023年04月08日
    浏览(38)
  • Flutter 和 Android原生(Activity、Fragment)相互跳转、传参

    本文主要讲解 Flutter 和 Android原生之间,页面相互跳转、传参, 但其中用到了 两端相互通信 的知识, 非常建议 先看完这篇 讲解通信的文章 : Flutter 与 Android原生 相互通信:BasicMessageChannel、MethodChannel、EventChannel_flutter eventchannel methodchannel basemessagechan-CSDN博客 当前案例 Flu

    2024年02月22日
    浏览(43)
  • 【Android】怎么使用一个ViewModel用在多个Activity或者Fragment中

    项目需求 在多个Activity或者Fragment中使用同一个ViewModel 需求实现 1.使用ActivityScope或FragmentScope 想在一个Activity或Fragment中共享ViewModel实例,可以使用ActivityScope或FragmentScope。这两种范围会根据它们所绑定的Activity或Fragment自动管理ViewModel实例的生命周期。 例如,创建一个继承自

    2024年02月15日
    浏览(41)
  • js跳转到指定url

    js怎么跳转到指定url方法如下: 需求:页面上点击按钮 需要调用设备提供的地址

    2024年02月11日
    浏览(50)
  • HTML跳转到页面指定位置

    使用纯超链接实现 1. 实现本页面跳转到指定位置(a.html),代码如下: 2. 实现点击跳转到新页面的指定位置,代码如下: 如果上方有导航条遮挡  

    2024年02月12日
    浏览(115)
  • vscode快速跳转到指定文件

    在 VS Code 中,您可以使用以下快捷键快速跳转到某个文件: 在 Windows 和 Linux 上,使用快捷键  Ctrl + P 。 在 macOS 上,使用快捷键  Cmd + P 。 这将打开 \\\"快速打开\\\" 命令框,您可以在其中输入文件名或路径来快速跳转到该文件。例如,如果您想跳转到 \\\"index.html\\\" 文件,只需在命令

    2024年02月11日
    浏览(66)
  • Nginx精确匹配并跳转到指定路径

    说明: 1、根据研发要求,将/welcome页面跳转到指定页面/example 2、请在Nginx配置文件server中配置 3、请查阅如下图所示:https://xxxx/welcom ——https://xxxx/example 说明:将所有精确匹配到/welcom的请求都重定向到/example这个路径下,并且以永久的方式进行重定向。

    2024年02月12日
    浏览(42)
  • Java for循环标签跳转到指定位置

    大家是否见过这种for循环,在for循环前加了个标记的: 我之前有一次在公司业务代码中见过有这种写法的,没在意,今天在看JDK线程池的代码时,又看到 ThreadPoolExecutor 的 addWorker 方法中有这种写法。于是就查了相关资料,也比较简单。 总结下它的用法吧: 上面代码中的 o

    2024年02月03日
    浏览(39)
  • 微信短链跳转到小程序指定页面调试

    首先说下背景:后端给了短链地址,但是无法跳转到指定页面。总是在小程序首页。指定的页面我们是h5页面。排查步骤如下: 1、通过快速URL Scheme 编译。上部普通编译 下拉找到此选项。 、 2、按照小程序的要求的URL Scheme输入。另外后端给的短链打开之后,拷贝尾缀作为t

    2024年02月10日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包