首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

旋转时保留TextView中的文本

在Android开发中,如果你想在旋转设备时保留TextView中的文本内容,你需要确保这些数据在配置更改(如屏幕旋转)时不会丢失。以下是一些基础概念和相关解决方案:

基础概念

  • 配置更改:当设备的配置发生变化时(如屏幕旋转、键盘显示/隐藏等),默认情况下会重新创建Activity。
  • 保存实例状态:为了避免在配置更改时丢失数据,你可以保存和恢复Activity的实例状态。

解决方案

1. 使用onSaveInstanceStateonRestoreInstanceState

这是最基本的方法,适用于保存少量数据。

代码语言:txt
复制
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("textViewText", textView.getText().toString());
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String savedText = savedInstanceState.getString("textViewText");
    textView.setText(savedText);
}

2. 使用ViewModel

对于更复杂的数据或需要在多个Activity/Fragment之间共享的数据,推荐使用ViewModel。

首先,添加依赖:

代码语言:txt
复制
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1"

然后创建一个ViewModel类:

代码语言:txt
复制
public class MyViewModel extends ViewModel {
    private MutableLiveData<String> text = new MutableLiveData<>();

    public LiveData<String> getText() {
        return text;
    }

    public void setText(String value) {
        text.setValue(value);
    }
}

在你的Activity中使用ViewModel:

代码语言:txt
复制
public class MainActivity extends AppCompatActivity {
    private MyViewModel viewModel;
    private TextView textView;

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

        textView = findViewById(R.id.textView);
        viewModel = new ViewModelProvider(this).get(MyViewModel.class);

        viewModel.getText().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String text) {
                textView.setText(text);
            }
        });
    }

    // 在需要更新文本的地方调用
    private void updateText(String newText) {
        viewModel.setText(newText);
    }
}

优势

  • 数据持久性:即使在屏幕旋转等配置更改时,数据也能保持不变。
  • 简化代码:使用ViewModel可以减少管理状态的复杂性,使代码更加清晰和易于维护。

应用场景

  • 表单填写:用户在填写表单时旋转设备,不想丢失已输入的数据。
  • 阅读应用:用户在阅读文章时旋转设备,希望保持当前阅读位置和内容。

可能遇到的问题及解决方法

  • 数据丢失:如果使用onSaveInstanceState但仍然遇到数据丢失,确保没有在其他地方意外地清除了保存的状态。
  • ViewModel初始化问题:确保ViewModel正确初始化,并且在Activity重建时能够获取到之前的状态。

通过上述方法,你可以有效地在屏幕旋转时保留TextView中的文本内容,提升用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

将包含数字形式的文本文件导入Excel中时保留文本格式的VBA自定义函数

标签:VBA Q:有一个文本文件,其内容包含很多以0开头的数字,如下图1所示,当将该文件导入Excel中时,Excel会将这些值解析为数字,删除了开头的“0”。...WorksheetFunction.Transpose(arrayList.ToArray())) arrayList.Clear Set arrayList = Nothing End Function 该函数中,...参数strPath是要导入的文本文件所在路径及文件名,参数strDelim是文本文件中用于分隔值的分隔符。...假设一个名为“myFile.txt”的文件存储在路径“C:\test\”中,可以使用下面的过程来调用这个自定义函数: Sub test() Dim var As Variant '根据实际修改为相应的文件路径和分隔符....Value = var '插入数组值 End With End Sub 这将打开指定的文本文件,并使用提供的分隔符将其读入,返回一个二维数组。

26910
  • Word VBA技术:复制带有自动编号的文本并在粘贴时保留编号的数字

    标签:Word VBA 在Word文档中,复制文本并在某处粘贴是经常要进行的操作。...然而,如果文档中包含有自动编号的文本内容,例如以自动编号的数字开头的文本,如果要复制的内容不包括第一个编号项,那么这种复制粘贴操作可能会导致问题。在这种情况下,原始文档中的数字和粘贴的文本将不匹配。...下面的代码会解决这样的问题。它将创建文本的副本,其中自动编号的数字已被转换为普通文本,以便在粘贴时保留数字。...." & vbCr & _ "本程序将自动编号的数字修改为正常文本,以便在其他位置粘贴时保持正确的数字编号." & vbCr & vbCr & _ "运行程序前,必须选择想要在其他位置插入的文本...End:=Selection.Range.End) rngRange.ListFormat.ConvertNumbersToText wdNumberParagraph '当转换数字时复制所选文本

    2.2K10

    Android中TextView文字设置不同的颜色

    在项目的过程中会遇到在一行文字中,部分功能需要不同的文字颜色来展示,下面介绍两种方式实现: 效果图: [wqs2rn595h.png] 这里写图片描述 方式一: 用SpannableStringBuilder...来实现 TextView tv=(TextView)findViewById(R.id.tv); String content = "只会玩战士回复冷云他大叔:啊哈哈哈或"; SpannableStringBuilder...blackSpan,12, 17, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv.setText(builder); 其中,”只会玩战士回复冷云他大叔:有钱任性” 为你要改变的文本...0为文本颜色改变的起始位置,5为文本颜色改变的结束位置。最后一个参数为布尔型,可以传入以下四种。...: TextView tv=(TextView)findViewById(R.id.tv); String str="只会玩战士回复<font

    9.8K20

    Android TextView 中 setText 的空指针异常

    第一次发现这问题,记录一下,在适配器里面给TextView设置一个int类型的值,然后闪退报错,DeBug模式下查看了布局和id,均没有问题,再次查看日志输出,Caused By: android.content.res.Resources...$NotFoundException:String resource ID #0x86,发现有两个词引起了注意String Resources,才知道TextView在内部实现时设置的类型为String...,所以用String.valueOf(),这里再啰嗦几句,在String类型的转化问题上,String.valueOf()效率最高,因为虚拟机对它进行了特殊处理,其次是toString,最后是+""的拼接形式...,拼接String的形式内部实现其实就是toString,但是要相对复杂一些,拼接过程中产生了常量和一些判断条件,效率低下,详情见源码

    1.7K10

    PQ-M及函数:文本中按给定列表保留所需字符内容

    文章中的方法,但发现里面的List.Select函数的判断都是针对连续的字符的,所以用了each _>”A”and _的判断条件,问题是,有时候要保留的内容可能不是这种连续的,比如保留英文和横杠...比如给了一个需要保留的列表,甚至可能是动态的,然后判断每个元素是不是属于要保留的列表中的元素? 大海:嗯,其实你能想到这个就可以去查阅函数帮助了,其中有个函数叫List.Contains。...z","-"}, _ ) ) ) 函数List.Contains,判断列表中是否包含某元素,也就是某个元素是否在列表中。...用法: List.Contains(列表,值) 参数: 列表:需要判断的列表 值:用于判断列表中是否包含的元素 小栗子: List.Contains({1,3,5},3) 结果:True 小勤:这个函数好...,以后甚至可以通过动态参数的方式将需要保留的内容传递进去,然后就可实现动态数据保留了。

    61830

    关于从相册中获取图片,图片展示时被旋转了

    调用Android系统相册功能后,三星手机照片被旋转了90度。 经资料查询,这是由于三星手机拍照的图片旋转角度是90度,而其它手机是0度。这样思路就出来了:先查询被旋转了多少度,然后再旋转回来。...originpath); // 把原图压缩后得到Bitmap对象 Bitmap bmp = getCompressPhoto(originpath); // 修复图片被旋转的角度...Bitmap bitmap = rotaingImageView(angle, bmp); // 保存修复后的图片并返回保存后的图片路径 return...// 将原始图片按照旋转矩阵进行旋转,并得到新的图片 if (bitmap !...BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inSampleSize = 10; // 图片的大小设置为原来的十分之一

    1.5K20

    CentOS 使用 yum update 更新时保留特定版本的软件

    有时需要保留特定版本的软件不升级,但升级其他软件,这时就需求用到下面的技巧。当CentOS/RHEL/Fedora下的Linux服务器使用 yum update 时命令如何排除选定的包呢?...image.png Yum使用/etc/yum/yum.conf或/etc/yum.conf中的配置文件。您需要放置exclude指令来定义要更新或安装中排除的包列表。这应该是一个空格分隔的列表。...当我使用yum update时,如何排除php和内核包?...disableexcludes = main install php yum --disableexcludes = repoid install php httpd 这里: all:禁用所有排除 main:禁用yum.conf中[...main]中定义的排除 repoid:禁用为给定repo id定义的排除 yum -exclude 命令行选项 最后,您可以使用以下语法在命令行上跳过yum命令更新: 注意:上述语法将按名称排除特定包,

    1.5K00

    IP地址中的保留地址

    因为本网络中的保留地址同样也可能被其它网络使用,如果进行网络互连,那么寻找路由时就会因为地址的不唯一而出现问题。...但是这些使用保留地址的网络可以通过将本网络内的保留地址翻译转换成公共地址的方式实现与外部网络的互连。这也是保证网络安全的重要方法之一。 ...在Windows系统中,这个地址有一个别名“Localhost”。寻址这样一个地址,是不能把它发到网络接口的。...如果你的主机开启了IRDP (Internet路由发现协议,使用组播功能)功能,那么你的主机路由表中应该有这样一条路由。 ...保留这样的地址供其使用是为了避免以后接入公网时引起地址混乱。使用私有地址的私 有网络在接入Internet时,要使用地址翻译(NAT),将私有地址翻译成公用合法地址。

    8.4K10

    TextView中DrawableXXX图片无法设置大小的解决方案

    在开发过程中我们往往会遇到图片旁边带文字的布局,这种布局有些比较Low的开发会直接用一个ImageView和TextView,有经验的会给TextView设置DrawableLeft、DrawableRight...等等属性,一个View搞定,但是这个属性设置图片是无法控制大小的,在xml里面,当然在Java代码里是可以设置的。...TextView textView = new TextView(mContext); Drawable drawable = getResources().getDrawable(R.drawable.icon_friend...); // 设置图片的大小 drawable.setBounds(0, 0, 20, 20); // 设置图片的位置,左、上、右、下 textView.setCompoundDrawables...(null, null, drawable, null); 当然,我们还可以用自定义View来实现这个效果,代码也是非常的简单 <!

    4.7K20

    浅谈ClickableSpan , 实现TextView文本某一部分文字的点击响应

    超文本:http://www.baidu.com  这么一个效果:一行文本当中 前面显示黑色颜色的“超文本:”,后面显示红色颜色的“http://www.baidu.com” 并且要求红色字体的部分可以点击...最简单的实现方法,两个TextView ,第一个显示黑色字体的“超文本”,第二个显示红色字体的“http://www.baidu.com”,然给给第二个TextView添加一个点击事件。...想想,确实可以这么实现,对于一般情况可以 但是,文本长度过长的情况下呢,会出现第二个TextView未能一行显示的文本会换行,但是不是在第二行的一开始 ?   而你希望的效果是    ?...在社交类APP中,一般都用类似QQ空间的功能吧,一个页面以列表的形式显示所有的动态(说说),每一个动态(说说)里又对应着相应的评论 ?...那么我们是不是可以用ClickableSpan类来实现 一个TextView显示不同颜色的文字并且点击相应的位置会有对应的响应事件的效果呢   问题来了,我们Demo中确定了一个TextView从哪些位置到哪些位置是有颜色或者点击事件的

    2.1K60

    使用 yum update 在CentOS下更新时保留特定版本的软件

    有时需要保留特定版本的软件不升级,但升级其他软件,这时就需求用到下面的技巧。当CentOS/RHEL/Fedora下的Linux服务器使用 yum update 时命令如何排除选定的包呢?...Yum使用/etc/yum/yum.conf或/etc/yum.conf中的配置文件。您需要放置exclude指令来定义要更新或安装中排除的包列表。这应该是一个空格分隔的列表。...当我使用yum update时,如何排除php和内核包?...disableexcludes = main install php yum --disableexcludes = repoid install php httpd 这里: all:禁用所有排除 main:禁用yum.conf中[...main]中定义的排除 repoid:禁用为给定repo id定义的排除 yum -exclude 命令行选项 最后,您可以使用以下语法在命令行上跳过yum命令更新: 注意:上述语法将按名称排除特定包,

    2.5K00

    目标检测中的旋转增强

    论文介绍 众所周知,一般的检测网络并不具备旋转不变性或者旋转等变性,在某些场景如遥感图像中,经常会对训练数据使用“旋转增强”来增强网络的性能。...这种通常的方法我们将它称为最大框法,它假设方框中的物体的形状为占满整个框的方形。...而本文作者提出,用最大内接椭圆来表示bounding box中物体的形状为更优的表示,对图片旋转后,对这个椭圆进行旋转,取椭圆的最大外接矩作为旋转后物体的真值框,如上图墨蓝色框所示。...\theta 度后的形状,\mathcal{B}() 表示对形状求最大外接水平矩形框, 这个优化公式即求出一个初始外接框中的最优的形状\hat{S},使得这个形状旋转 \theta 度后的外接框和真实形状旋转...总结 本文针对目标检测中的旋转增强提出两个贡献: 旋转增强后新的标签怎么生成的问题,提出了比最大框法更优的椭圆表示法 提出用于回归损失计算的旋转不确定损失RU Loss,进一步提升了效果

    43720

    ggplot2着色时如何保留没有用到的因子

    我们有时候会遇到这样的情况,你的数据分为多个类别,画图的时候是根据这个类别来着色的。后面做了一些处理之后,可能有些类别的数据被过滤掉了,再去画图的时候,颜色就跟前面不对应了。...下面小编结合一个具体的例子来展示一下。...levels 那么怎么才能,让这两个点的颜色保持跟第一张图里面一致呢 #如果想让这两个点的颜色跟前面三个点的颜色对应,可以用scale_colour_hue(drop = FALSE) ggplot...,但是对应的level这里保留了,从而确保了颜色跟第一幅图是对应的。...这种方法在单细胞数据分析的时候很实用,能够保证使用不同的feature分群聚类得到的细胞亚群展示的时候,颜色是一致的,方便对比观察。

    26930

    浅谈ClickableSpan , 实现TextView文本某一部分文字的点击响应

    超文本:http://www.baidu.com  这么一个效果:一行文本当中 前面显示黑色颜色的“超文本:”,后面显示红色颜色的“http://www.baidu.com” 并且要求红色字体的部分可以点击...最简单的实现方法,两个TextView ,第一个显示黑色字体的“超文本”,第二个显示红色字体的“http://www.baidu.com”,然给给第二个TextView添加一个点击事件。...想想,确实可以这么实现,对于一般情况可以 但是,文本长度过长的情况下呢,会出现第二个TextView未能一行显示的文本会换行,但是不是在第二行的一开始 ?   而你希望的效果是    ?...在社交类APP中,一般都用类似QQ空间的功能吧,一个页面以列表的形式显示所有的动态(说说),每一个动态(说说)里又对应着相应的评论 ?...那么我们是不是可以用ClickableSpan类来实现 一个TextView显示不同颜色的文字并且点击相应的位置会有对应的响应事件的效果呢   问题来了,我们Demo中确定了一个TextView从哪些位置到哪些位置是有颜色或者点击事件的

    1.2K40

    TextView设置文字包含中英文时自动换行问题的终极解决方案

    解决android textview自动换行问题 情景,正常TextView中设置文本内容中包含中英文时会造成自动换行的问题,影响界面显示效果,如图: 最终是要如下代码完美解决,...的文本内容,改方法不能再主线程中执行 * @param text */ public void setAdaptiveText(String text) {...textView) { final String originalText = textView.getText().toString(); //原始文本 final...() - textView.getPaddingLeft() - textView.getPaddingRight(); //TextView的可用宽度 //将原始文本按行拆分...setText 方法,注意该方法不能再主线程中执行 如果TextView宽度设置为WrapContent,为了测量它的准确宽度,可先使用setText()方法设值,再调用setAdaptiveText(

    3.7K10
    领券