Android后退堆栈

这篇具有很好参考价值的文章主要介绍了Android后退堆栈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

修改代码

现在的ItemClick使得用户单击其中一个项目时就会跳转,现在要修改其使得在一个小屏幕设备上才会这样做,在一个大屏幕设备上运行用户选择一个训练项目时在右边的片段显示响应的信息。

希望片段处理后退的方式:假设用户在手机上运行这个应用,单击一个训练项目时,会在另一个活动中显示这个训练项目的详细信息。如果用户单击后退按钮,他们会回到训练项目列表。在平板上后退时则希望回到之前选择的第一个项目,回到前一个片段的状态。

后退堆栈

在应用中从一个活动访问到另一个活动时,Android会把各个活动增加到一个后退堆栈,来跟踪你访问过的所有活动,后退堆栈是一个日志,记录了你在设备上访问过的所有地方,每个地方记录为一个单独的事务。
后退堆栈不止适用于活动,还适用于任何类型的事务,包括对片段的改变。

如何将片段的变化作为单独的事务记录到后退堆栈呢?
每次用户选择一个不同的训练项目时,我们都要把整个WorkoutDetailFragment替换为一个新实例,WorkoutDetailFragment的各个新实例将显示用户选择的训练项目的详细信息。这样我们就能把各个片段替换作为单独的事务增加到后退堆栈。每次用户单击后退按钮时,最近的事务就会从栈顶退出,用户会看到他们选择的前一个训练项目的信息。

使用帧布局替换片段

将activity_main.xml(large)中的代码替换如下:

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

    <fragment
        android:name="com.hfad.workout.WorkoutListFragment"
        android:id="@+id/list_frag"
        android:layout_width="0dp"
        android:layout_weight="2"
        android:layout_height="match_parent"/>

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent" />
</LinearLayout>

然后我们可以通过布局差别区分设备使用的布局,通过检查布局是否包含上一页我们增加的帧布局来区分所使用的布局版本,代码如下:

 View fragmentContainer = findViewById(R.id.fragment_container);
 if (fragmentContainer != null){
     
 }else {

使用片段事务

只要活动在允许,可以通过编程向活动的布局增加一个片段。为此只需要一个用来放置片段的视图组,如帧布局。可以使用片段事务在运行时增加、替换或删除片段。片段事务是与片段有关的一组连续的片段。
创建一个片段事务时,需要做三件事:
1、开始事务
这会告诉Android你要启动一系列改变,这些改变要记录在一个事务中。
2、指定改变
这些是事务中要包含的所有动作。这可能包括增加、替换或删除一个片段、更新它的数据,以及把它增加到后退堆栈。
3、提交事务
这会完成事务,并应用所做的改变。
1、开始事务
开始一个事务时,首先得到活动的片段管理器的一个引用。从上一章可以知道,片段管理器用于管理活动使用的所有片段。如果你使用了支持库片段,要使用以下方法得到片段管理器的引用:

getSupportFragmentManager()

一旦有了片段管理器的引用,可以调用它的beginTransaction()方法开始事务:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

2、指定改变
开始事务后,需要指出这个事务包括哪些片段。
如果想为活动的布局增加一个片段,可以调用片段事务的add()方法。这个方法有两个参数,要加入片段的那个视图组的资源ID,以及你想要增加的片段。代码如下:

//创建片段
WorkoutDetailFragment fragment = new WorkoutDetailFragment();
//将片段添加到ViewGroup
transaction.add(R.id.fragment_container, fragment);
//替换片段
transaction.replace(R.id.fragment_container, fragment);
//删除片段
transaction.remove(fragment);
//设置事务过渡动画(非必需)
transaction.setTransition(transaction);
//将事务增加到后退堆栈中,其参数是一个String类,可以作为事务的标签,大多数情况下都不需要指定事务的标签传入null
transaction.addToBackStack(null);

3、提交事务

//提交事务
transaction.commit();

更新MainActivity中的itemClicked方法

package com.hfad.workout;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentTransaction;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity implements WorkoutListFragment.Listener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void itemClicked(long id) {
        View fragmentContainer = findViewById(R.id.fragment_container);
        if (fragmentContainer != null){
            WorkoutDetailFragment details = new WorkoutDetailFragment();
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            details.setWorkoutId(id);
            //每次用户单击一个训练项目时,要把这个片段替换为它的一个新实例
            //这是WorkoutDetailFragment的一个新实例,它会显示用户选择的那个训练项目的详细信息。
            ft.replace(R.id.fragment_container, details);
            //设置片段淡入淡出
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            //将这个事务增加到后退堆栈
            ft.addToBackStack(null);
            ft.commit();
        }else {
            Intent intent = new Intent(this, DetailActivity.class);
            intent.putExtra(DetailActivity.EXTRA_WORKOUT_ID, (int)id);
            startActivity(intent);
        }

    }
}

试着运行一下,可以达到预期效果了
Android后退堆栈,Android实践,android

旋转屏幕时会出问题

选装设备时,Android会撤销然后重新创建活动,如果该活动使用了一个片段,这个片段会随着这个活动撤销和重建。所以仍然需要更新onSaveInstance保存信息,在onreate中取出。
更新WorkoutDetailFragment.java

package com.hfad.workout;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import android.os.PersistableBundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class WorkoutDetailFragment extends Fragment {

    //用来表示用户选择的训练项目的ID
    private long workoutId;

    @Override
    //Android需要这个片段的布局时会调用这个方法
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // 这会告诉Android这个片段使用哪个布局
        return inflater.inflate(R.layout.fragment_workout_detail, container, false);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null){
            workoutId = savedInstanceState.getLong("workoutId");
        }
    }

    public void onStart() {
        super.onStart();
        //得到片段的根视图,然后使用这个根视图得到两个文本视图的引用
        View view = getView();
        if (view != null) {
            TextView title = (TextView) view.findViewById(R.id.textTitle);
            Workout workout = Workout.workouts[(int)workoutId];
            title.setText(workout.getName());
            TextView description = (TextView) view.findViewById(R.id.textDescription);
            description.setText(workout.getDescription());
        }
    }

    public void setWorkoutId(long id) {
        this.workoutId = id;
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putLong("workoutId", workoutId);
    }
}

自此、大功告成!文章来源地址https://www.toymoban.com/news/detail-695736.html

到了这里,关于Android后退堆栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Android Compose 介绍与实践

    Jetpack Compose 是 Google 官方 2019 年推出的UI框架,它可简化并加快 Android 的 UI 开发工作。使用更少的代码、强大的工具和直观的 Kotlin API,快速构建 App 的 UI。2021年迎来 Compose 的正式版,来了解一下这个官方强推的,布局机制、渲染机制、具体写法等可以说是全新的UI框架了。

    2024年02月09日
    浏览(30)
  • Android页面渲染效率优化实践

      1.车系页布局渲染现状  车系页是重要的车系信息页面,更新迭代多年,页面布局不断变化,xml布局文件越写越复杂。 获取车系页布局文件耗时: 结果如下:   2.卡顿的原因 2.1 Android绘制原理 ► 1.Android的屏幕刷新中涉及到最重要的三个概念 (1)CPU:执行应用层的measure、layo

    2023年04月15日
    浏览(33)
  • Unity Android Studio 混合开发实践(Unity工程导入Android项目进行开发)

    最近接到一个任务是将一个unity开发的游戏接入到现有的Android项目里,然后在现有的App实现点击一个按钮打开游戏,并且在游戏内提供一个可以退出到App的按钮。 整体需求是很明确的,难点主要有两个: 我们公司是做应用开发的,没有任何游戏开发的技能储备。 在游戏中需

    2024年02月11日
    浏览(44)
  • Android Hook的探索与实践

    Hook,中文译为“挂钩”或“钩子”。要“钩”到什么呢?在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程序就能在第一时间对该事件做出响应,甚至可以截断此事件。 本文,侧重于Java层的hook。 Hook其实很简单,总体概括,分为三步: 釜底抽薪 分

    2023年04月17日
    浏览(28)
  • Android MediaPlayer 深入分析与实践

            MediaPlayer 是 Android 提供的一个强大的音视频播放类,它允许开发者在应用程序中嵌入音频和视频的播放功能。本文从 MediaPlayer 的概述、工作原理、使用方法以及优势与局限性等方面进行全面的分析,并结合实际代码示例来指导读者如何高效地使用该技术。     

    2024年04月09日
    浏览(58)
  • 【android studio实践计算机界面】

    新建项目 1、打开Android Studio 2、创建项目 点击右上角【New Project】 选择“Empty Activity”,然后点击“Next 3、设置项目基本信息 4、等待项目文件加载 打开界面文件 res/layout/activity_main.xml 点击右上角Split,切换显示模式 1、设置线性布局 在这里插入图片描述 2、增加子容器 3、添

    2023年04月19日
    浏览(33)
  • Android-图片压缩详解:原理、方法与实践

    在Android应用开发中,处理图片是一个非常常见的需求。然而,大尺寸和高质量的图片可能会占用大量内存,导致应用程序性能下降,甚至引发OOM(Out of Memory)错误。因此,对图片进行合适的压缩是非常重要的。本文将详细介绍Android图片压缩的原理、方法和实践。 图片压缩的

    2024年02月16日
    浏览(24)
  • Android下单元测试实践——测试框架简介

    测试代码的写法可以归纳为三部分 第一部分: 准备测试数据和定义mock行为 第二部分: 调用真实的函数 第三部分: 调用验证函数进行结果的验证 在模块的test路径下编写测试案例。在类中使用@Test注解,就可以告诉Junit这个方法是测试方式。同时使用assert*方法,可以调用J

    2024年02月04日
    浏览(29)
  • 实现 Android UI 自适应的最佳实践

            在 Android 开发中,不同设备的屏幕尺寸和分辨率千差万别,导致同一个界面在不同设备上的显示效果可能大相径庭。因此,为了在各种设备上都能呈现出优秀的 UI,开发者需要进行 UI 自适应的设计。         ScreenAdapterLayout 是一个自定义的继承自 RelativeLayout

    2024年02月22日
    浏览(29)
  • android 手机获取root权限(刷入magisk面具方式)_获取刷入模块_MIUI_android7/android12实践

    Magisk安装教程 - Magisk中文网 (magiskcn.com) android12: How to Root Xiaomi Redmi Note 11T Pro / 11T Pro+ using Magisk without TWRP (getdroidtips.com) 视频教程 ★ bigstar ★ 玩机必看!带你入坑安卓刷机,小白也能看懂的ROOT基础指南来啦!_哔哩哔哩_bilibili 将前面列出的参考都看一遍 最好把文章结尾的基

    2024年02月06日
    浏览(78)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包