Android:方向更改会擦除对我的 ImageView 所做的修改

2024-01-19

我有一个应用程序,其中有 ImageView。我打开新的活动,用手指画一些东西,这个位图返回到我的 ImageView。一切都很好,但是当我现在改变方向时,我的 ImageView 活动会重新绘制或重新启动,并且 imageview 为空。我尝试了一切,我尝试 SaveState 并恢复状态,尝试配置更改,等等,但没有任何效果......

package jilova.Android.TextFolder;

import java.io.ByteArrayOutputStream;

import jilova.Android.Enums;
import jilova.Android.R;
import jilova.Android.DatabaseFolder.LocalDB;
import jilova.Android.DatabaseFolder.RequestRow;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.Toast;

public class Text extends Activity{

    private static EditText t1;
    private static EditText t2;
    private static EditText t3;
    private static EditText t4;
    private static ImageView iv1;
    private static Context c;
    private static Activity ac;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.text);

        Object o = this.getLastNonConfigurationInstance();
        if(o!=null)
        {
            Enums.sign=(Bitmap)o;
        }

        c=this.getApplicationContext();
        ac=this;

        ImageView iv = (ImageView)this.findViewById(R.id.imageView1);
        iv.setDrawingCacheEnabled(true);
        t1 = (EditText)this.findViewById(R.id.TEXTNote);
        t2 = (EditText)this.findViewById(R.id.TextET2);
        t3 = (EditText)this.findViewById(R.id.TextET3);
        t4 = (EditText)this.findViewById(R.id.TextET4);

        //iv.setImageBitmap(Bitmap.createScaledBitmap(Enums.sign, iv.getWidth(), iv.getHeight(), false).copy(Config.ARGB_8888, true));

    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

        }
        // Checks whether a hardware keyboard is available
        if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {

        } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {

        }
    }





    public static RequestRow getData()
    {
        RequestRow row = new RequestRow();
        row.SetREQUESTNOTE(t1.getText().toString());
        row.SetREQUESTTYPEID(Integer.parseInt(t2.getTag().toString()));
        row.SetTYPTECHUDRZBYID(Integer.parseInt(t3.getTag().toString()));
        row.SetOBJECTID(Integer.parseInt(t4.getTag().toString()));
        return row;
    }

    public static void setData(String REQUESTTYPEID ,String TYPTECHUDRZBYID,String OBJECTID,String REQUESTNOTE,String REQUESTID)
    {
        t1.setText(REQUESTNOTE);
        t2.setTag(REQUESTTYPEID);
        t2.setText(LocalDB.dbGetRequestTypeByID(c, Integer.parseInt(REQUESTTYPEID)));
        t3.setTag(TYPTECHUDRZBYID);
        t3.setText(LocalDB.dbGetTypTechUdrzbyByID(c, Integer.parseInt(TYPTECHUDRZBYID)));
        t4.setTag(OBJECTID);
        t4.setText(LocalDB.dbGetObjectByID(c, Integer.parseInt(OBJECTID)));
        Bitmap b = LocalDB.dbGetDocumentByID(c, Integer.parseInt(REQUESTID));
        if(b!=null)
        {
            iv1.setImageBitmap(b);
        }
    }

    public static Bitmap getSign()
    {
        iv1.buildDrawingCache();
        Bitmap ret = iv1.getDrawingCache();

        if(Enums.EmptySignHash)
        {
            return null;
        }
        else
        {
            return ret;
        }
    }

    public void Sign(View button)
    {
        Intent s = new Intent(Text.this,Sign.class);
        startActivityForResult(s,Enums.SIGNREQUESTID);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        if(resultCode!=Activity.RESULT_OK)
        {
            return;
        }
        Enums.IDLocal=-1;
        if(requestCode==Enums.GetData)
        {
            Bundle  extras = data.getExtras();
            if(extras !=null)
            {
                EditText et = (EditText)this.findViewById(extras.getInt("ViewID"));
                et.setText(extras.getString("Value"));
                et.setTag(extras.get("ID"));
            }
        }
        else if(requestCode==Enums.SIGNREQUESTID)
        {
            Bundle  extras = data.getExtras();
            if(extras !=null)
            {
                ImageView iv = (ImageView)this.findViewById(R.id.imageView1);
                try
                {
                    byte[] b = extras.getByteArray("Bitmap");
                    Enums.sign = Bitmap.createBitmap(BitmapFactory.decodeByteArray(b, 0, b.length), 0, 0, ac.getWindowManager().getDefaultDisplay().getWidth(), 200);
                iv.setImageBitmap(Bitmap.createScaledBitmap(Enums.sign, iv.getWidth(), iv.getHeight(), false));

                }
                catch(Exception e)
                {
                    int a=0;
                }
            }
            Enums.EmptySignHash=false;
        }
    }

    public static void DeleteAll()
    {
        EditText t = (EditText)ac.findViewById(R.id.TEXTNote);
        t.setText("");
        t.setTag(-1);
        t = (EditText)ac.findViewById(R.id.TextET2);
        t.setText("");
        t.setTag(-1);
        t = (EditText)ac.findViewById(R.id.TextET3);
        t.setText("");
        t.setTag(-1);
        t = (EditText)ac.findViewById(R.id.TextET4);
        t.setText("");
        t.setTag(-1);

        ImageView iv = (ImageView)ac.findViewById(R.id.imageView1);
        //Bitmap b = Bitmap.createBitmap(Enums.createColors(), 0, Enums.STRIDE, Enums.WIDTH, Enums.HEIGHT, Bitmap.Config.ARGB_8888).copy(Bitmap.Config.ARGB_8888, true);
        iv.setImageBitmap(Bitmap.createScaledBitmap(Enums.sign, ac.getWindowManager().getDefaultDisplay().getWidth(), iv.getLayoutParams().height, false));

        Enums.EmptySignHash=true;
    }

    public void Delete(View button)
    {
        EditText t = (EditText)this.findViewById(R.id.TEXTNote);
        t.setText("");
        t.setTag(-1);
        t = (EditText)this.findViewById(R.id.TextET2);
        t.setText("");
        t.setTag(-1);
        t = (EditText)this.findViewById(R.id.TextET3);
        t.setText("");
        t.setTag(-1);
        t = (EditText)this.findViewById(R.id.TextET4);
        t.setText("");
        t.setTag(-1);

        ImageView iv = (ImageView)this.findViewById(R.id.imageView1);
        //Bitmap b = Bitmap.createBitmap(Enums.createColors(), 0, Enums.STRIDE, Enums.WIDTH, Enums.HEIGHT, Bitmap.Config.ARGB_8888).copy(Bitmap.Config.ARGB_8888, true);
        iv.setImageBitmap(Bitmap.createScaledBitmap(Enums.sign, ac.getWindowManager().getDefaultDisplay().getWidth(), iv.getLayoutParams().height, false));

        Enums.EmptySignHash=true;

    }

    public void GetData(View button)
    {
        if(button.getId()==R.id.TextIB3)
        {
            Intent ChooseAction = new Intent(Text.this,ChooseData.class);
            Enums.Data = LocalDB.dbLocalSelect(this.getApplicationContext(),"Select typtechudrzbyid,typtechudrzbydesc from typtechudrzby");
            if(Enums.Data==null)
            {
                Toast t=Toast.makeText(this, "Chyba lokalni db", Toast.LENGTH_SHORT);
                t.setGravity(Gravity.CENTER, 0, 0);
                t.show();
                return;
            }
            ChooseAction.putExtra("ViewID", R.id.TextET3);
            startActivityForResult(ChooseAction,Enums.GetData);
        }
        else if(button.getId()==R.id.TextIB2)
        {
            Intent ChooseAction = new Intent(Text.this,ChooseData.class);
            Enums.Data = LocalDB.dbLocalSelect(this.getApplicationContext(),"Select Requesttypeid,requestname from requesttype");
            if(Enums.Data==null)
            {
                Toast t=Toast.makeText(this, "Chyba lokalni db", Toast.LENGTH_SHORT);
                t.setGravity(Gravity.CENTER, 0, 0);
                t.show();
                return;
            }
            ChooseAction.putExtra("ViewID", R.id.TextET2);
            startActivityForResult(ChooseAction,Enums.GetData);
        }
        else if(button.getId()==R.id.TextIB4)
        {
            Intent ChooseAction = new Intent(Text.this,TreeData.class);
            Enums.TreeData = LocalDB.dbLocalSelectTree(this.getApplicationContext(),"Select objectid,objectname,objectref from Objects");
            if(Enums.TreeData==null)
            {
                Toast t=Toast.makeText(this, "Chyba lokalni db", Toast.LENGTH_SHORT);
                t.setGravity(Gravity.CENTER, 0, 0);
                t.show();
                return;
            }
            ChooseAction.putExtra("ViewID", R.id.TextET4);
            startActivityForResult(ChooseAction,Enums.GetData);
        }
        else
        {
            //throw new Exception();
        }       

    }
}

当默认情况下发生屏幕旋转等配置更改时,您的 Activity 将被销毁,然后重新创建(调用当前 Activity 的 onDestroy,然后调用新版本 Activity 的 onCreate)。

您可以:

  • 当配置发生更改时,停止 Android 重新创建您的 Activity。要执行此操作,请添加android:configChanges="keyboardHidden|orientation"到清单中的活动标签。不建议这样做,因为如果您想要针对不同的配置使用不同的布局等,您将必须自己处理更改布局。
  • 覆盖onRetainNonConfigurationInstance并从中返回你的位图。在onCreate检查最后一个非配置实例是否不为空,在这种情况下将其转换为位图,然后设置图像。

对于后一种情况,请使用如下所示的内容:

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

    // Check if our activity was just destroyed and re-created
    final Object retainedFromConfigChange = getLastNonConfigurationInstance();
    if (retainedFromConfigChange != null) {
        // Activity has just been recreated, get the image we were working on
        // before the configuration change
        ImageView iv = (ImageView)ac.findViewById(R.id.imageView1);
        iv.setImageBitmap((Bitmap) retainedFromConfigChange);
    }

    ...
}

@Override
public Object getLastNonConfigurationInstance() {
    ImageView iv = (ImageView)ac.findViewById(R.id.imageView1);
    // We have to return a plain old Bitmap and not a drawable of any sorts
    // or we will get memory leaks so we need to extract the bitmap from the drawable
    return ((BitmapDrawable) iv.getDrawable()).getBitmap();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:方向更改会擦除对我的 ImageView 所做的修改 的相关文章

  • Whatsapp 在 Android 中共享音频文件时正在剪切音频文件

    我在共享格式不是 mp3 的音频文件时遇到问题 文件被共享 但长度较短 例如 如果文件有 10 秒 则仅共享 5 秒 如果我使用 mp3 格式 它会完全共享 但其他格式会出现问题 注意 该文件在其他应用程序 如Messenger 中共享没有
  • Android 构建 gradle 在特定设备上失败

    我面临一个奇怪的问题 当我编译我的应用程序以在 Android 7 0 的设备上运行它时 它可以工作 但是当我尝试为 Android 4 2 1 的设备进行编译时 它会失败并出现以下错误 错误 任务 app transformClasses
  • Sqlite 查询检查 - 小于和大于

    return mDb query DATABASE TABLE new String KEY ROWID KEY LEVEL KEY LEVEL gt 3 lt 5 null null null null 我究竟做错了什么 它返回的值全部高
  • android - 过度绘制布局允许通过 LinearLayout 进行触摸

    在下面的 UI 中 我将下面的 drabable 覆盖了整个屏幕 LinearLayout 是透明的 并允许其下方的控件可单击或可触摸 基本上我可以滚动此 LinearLayout 下面的列表以及单击控件 我如何禁用它 See attach
  • 如何在 Android 中创建刮刮卡?

    我需要为我在学校的期末项目创建一个 刮刮卡 应用程序 但找不到如何实现刮刮事件的方法 如何创建背景图像并在其上放置灰色矩形 所以当我刮刮这些矩形时我会看到他们下面的图片 实现必须在 Android 中 因为我还不知道如何在 Objectiv
  • PhoneGap 是应用程序开发的好选择吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 明文 HTTP 流量...不允许

    我的程序从用户那里获取一个 URL 因此它可以向互联网上的任何网站发出请求 我试图让这成为可能 我查找了有关 Android HTTP Cleartext 错误的所有答案 并做了这个 但它仍然不允许我连接我的测试本地 PHP 服务器 我在这
  • 注销时Firebase facebook按钮android身份验证

    我在我的 Android 应用程序中使用 firebase 并在 facebook SDK 中使用登录 我面临的唯一问题是 当我使用 facebook 登录然后注销时 facebook 登录按钮处于 注销 状态 当我单击它时 它会询问我是否
  • Android Things 文件系统

    我正在 Android 上构建这个应用程序 我希望能够让它访问 U 盘上的媒体文件 甚至树莓派的 SD 卡上的媒体文件 我还不知道我将如何处理这些文件 但我只是想知道它是否可能 如果不是这样也没关系 我还有其他解决方案 但我想我会先从明显的
  • NullPointerException org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDragEvent

    大约 10 天前 我的应用程序开始记录此异常 在开发控制台上看到 java lang NullPointerException at org chromium android webview AwContents AwViewMethods
  • 如何知道点击的widget id?

    我已经实施了一个widget与ImageButton and a TextView That ImageButton启动一个activity当它被点击时 这activity使用用户在活动上写入的内容更新小部件文本EditText 现在的问题
  • 如何从debug.keystore文件获取MD5?

    我使用一些命令来获取 MD5 私钥debug keystore文件 但实际上我得到的是 SHA1 私钥而不是 MD5 我不知道如何获得MD5 这是我使用的命令 keytool list alias androiddebugkey keyst
  • 将搜索结果更新为 Android 中的 Lazy Adapter

    我有项目列表 想为其实现搜索功能 因此 我有一个带有 addTextChangedListener 的文本框 搜索结果运行良好 但当我尝试将结果设置为 ListView 时 新结果将附加到旧结果中 我正在使用惰性适配器 如何清除适配器中的旧
  • 使用startActivityForResult,如何获取子活动中的requestCode?

    我有四项活动 即 A B C 和 D 我的情况是A将通过startActivityForResult启动活动B startActivityForResult new Intent this B class ONE 在另一种情况下 我将使用不
  • EditText 的高度不会扩展到其父级的高度

    我在滚动视图中放置了编辑文本 高度 match parent并期望它的高度等于滚动视图 但事实并非如此 它的高度就像wrap content这意味着如果 EditText 中没有文本 我必须将光标指向要弹出的软键盘的第一 行 我想要的是我可
  • MPAndroidChart:组合图表

    我在用MPAndroidChart 库 https github com PhilJay MPAndroidChart 我想用CombinedChart创建这样的图表 那可能吗 我尝试了一下 但似乎不起作用 因为 这些条目没有按我的预期工作
  • Android apk 调试模式工作正常,但发布模式给出太多警告

    我正在尝试从 eclipse 获取签名的 APK 我有一个可调试的 apk 版本 运行良好 现在发布时 当我尝试使用 Eclipse ADT 进行编译和签名时 我收到很多警告 其中大部分是can t find superclass or i
  • 如何使用asynctask显示倒计时的进度条?

    在我的应用程序中 我希望用户按下按钮 然后等待 5 分钟 我知道这听起来很糟糕 但就这样吧 5 分钟等待期间的剩余时间应显示在进度条中 我使用带有文本视图的 CountDownTimer 来倒计时 但我的老板想要看起来更好的东西 这就是进度
  • Admob - 没有广告可显示

    你好 我尝试制作一些在 Android 手机上显示广告的示例程序 并尝试在 v2 2 的模拟器上测试它 代码中的一切似乎都很好 但调试器中的 AdListener 表示 响应消息为零或空 onFailedToReceiveAd 没有广告可显
  • SambaFileInputStream 和 FileInputStream 有什么不同?

    我需要从 samba 服务器流式传输视频 并且我使用 nanohttpd 在我的项目中创建简单的服务器 当我使用本地文件中的 fileinputstream 时 视频视图可以按设置播放视频 http localhost 8080 publi

随机推荐

  • 如何让 Jaws 读取 aria-descriptedby 属性

    问题如标题中所述 这是我的 HTML 代码 li a href https illinois edu toolbox 0 portlet componentId 13 amp desktopId 1 setup a li div HELLO
  • 在 WSDL 文件中包含架构类型

    我手工创建了一个 WSDL 它只有一个操作 没有输入参数 也没有输出参数 当我尝试从此 WSDL 创建客户端时 出现以下错误 无法导入 wsdl portType 详细信息 运行 WSDL 导入扩展时引发异常 System ServiceM
  • 通过 Android 与串行 USB 设备通信

    我有一台用于测量电流的定制设备 该设备可以连接到 PC 并通过 USB 进行通信 它基于FTDI芯片 我有用 Java 编写的应用程序 该应用程序使用 rxtxSerial dll 库和 gnu io rxtx 2 1 7 4 jar 现在
  • 使用opencv GPU旋转图像

    我在用着GPU 旋转 https docs opencv org 2 4 modules gpu doc image processing html gpu rotate从 opencv lib 顺时针旋转图像 include
  • 基于std::vector的N维张量

    我想使用 std vector 定义 n 维数据结构 我对operator 的定义有疑问 让我们看一下二维结构示例 class my data public my data size t N size t M tab N M N N M M
  • 如何从 HTML 字符串获取 beautiful soup 中的开始和结束标签?

    我正在使用 beautiful soup 编写一个 python 脚本 其中我必须从包含一些 HTML 代码的字符串中获取开始标记 这是我的字符串 string p p 我想要得到 p 在一个名为opening tag and p 在一个名
  • 有没有办法在每次启动 cmd 时运行 vcvars32.bat?

    我在用着cl in cmd并且不得不跑vcvars32 bat每次我打开一个cmdwindow 确实是一个痛苦的 axx 谁能提供一种自动运行它的方法 From cmd 如果在命令行上未指定 D 则当 CMD EXE 启动时 它 查找以下
  • DDD“查看对象”?

    假设一个应用程序涉及公司 我可能有一个公司类 我将有一个填充列表 的数据访问层 但是 有时 例如显示搜索结果 我只需要显示公司名称 电话和邮政编码属性 并且在我看来 用其所有属性填充整个公司对象似乎很浪费 就 DDD 设计而言 解决此问题的
  • Redmine错误日志致命:不是git存储库

    我在git服务器 gitlab 上安装了redmine 这是我们的主要git服务器 同一台机器 当我在redmine web中添加存储库 通过gitlab 信息时 redmine日志说 usr local redmine log devel
  • 如何限制 macOS 窗口管理恢复特定窗口?

    我有一个应用程序 它有几个窗口定义为窗口组 其结构符合主场景中的应用程序 WindowGroup StandingsView StandingsView environmentObject appServices handlesExtern
  • 如何为 flutter 应用程序添加 Android 通知通道 ID 以修复应用程序在后台运行时的通知

    在我的 flutter 应用程序中 onResume 和 onLunch 函数在 Android 平台上不起作用 但它们在 IOS 上运行良好 我在控制台上收到以下消息 而不是这些函数中的打印字符串 W FirebaseMessaging
  • 使用任意方法(插件、GreaseMonkey?)在 Chrome 或 Firefox 中使用 JavaScript 移动鼠标光标

    我需要在浏览器中移动鼠标光标位置 我可以使用任何方法 只要它在 Google Chrome 或 Firefox 中 其中之一即可 在最好的情况下 我想用javascript控制鼠标位置 有什么简单的方法可以做到这一点吗 谢谢 菲尔 我认为这
  • Unity 2017.3.0f3发布数据未发送到LAMP服务器

    看起来我的 cpanel WHM 服务器有probably 虽然我不确定原因是什么 已经设置了一些安全设置 其中 PHP 没有接收从其他域 计算机 设备发布的表单数据 我已经测试了 null REQUEST 以及 POST 以防万一 转储的
  • 当某些任务可以为空时如何处理 WhenAll?

    我想等待所有任务 但其中一些可以为空 它是这样的代码 Task
  • 允许从文本区域输入提交 HTML?

    我如何允许从文本区域提交 HTML 我对此非常绝望 我找到的每个答案都给了我很差的信息 因为我不知道该怎么做 我有这个文本区域
  • 如何限制用户 SSH 访问某些文件夹

    目前 我们正在进行的项目有一名自由前端开发人员参与 由于我们以前从未使用过他 因此我们正在寻找一种方法来限制他对我们的服务器和文件的访问 但同时让他修改这些服务器上当前的视图文件 当前项目 全部在一台服务器上 被划分为 6 个独立的迷你站点
  • VS2010:自动生成的 XML 文档文件不更新

    我在vs2010中有一个C 项目 生成一个XML文档文件 我已将生成文件的输出路径设置为项目输出路径 我的问题是 当文档文件的路径与项目输出路径相同并且文件名相同 文件扩展名除外 时 文件不会更新 Does not更新 XML 文件 C M
  • 使两个脚本进行通信

    我必须使两个程序 例如 脚本 A py 和 脚本 B exe 进行通信 两个程序都处于无限循环中 脚本 A 需要写入脚本 B 的 stdin 然后读取脚本 B 的 stdout 然后再次写入 等等 脚本 B 我无法更改 这两个文件都在我的硬
  • 减少 C++ 代码大小

    我正在研究一种用于微控制器的动态语言 编译为 C 作为一名 CS 人员 我决定首先正确地完成它 然后再担心优化 以下是我的对象系统的结构 Base Interface Number Interface Int Float Char Sequ
  • Android:方向更改会擦除对我的 ImageView 所做的修改

    我有一个应用程序 其中有 ImageView 我打开新的活动 用手指画一些东西 这个位图返回到我的 ImageView 一切都很好 但是当我现在改变方向时 我的 ImageView 活动会重新绘制或重新启动 并且 imageview 为空