上下文实例的问题以及解决思路

事发原因

当我在写用户点击按钮后启动文件管理器,选择文件并导入到指定目录里,获取权限也不说,他需要注册上下文实例才能实现,当我在自定义控件上实现的时候

他却移动到其他app的时候,发现还是闪退,闪退原因至今没理解

FATAL EXCEPTION: main
                                                                                                    Process: com.example.myapplication, PID: 26000
                                                                                                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.xiaojieyahu.top.PopupActivity}: java.lang.ClassCastException: com.xiaojieyahu.top.themui7 cannot be cast to com.xiaojieyahu.top.ImportZipButton
                                                                                                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3909)
                                                                                                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4055)
                                                                                                        at 

大概说我AndroidX库未完全集成看到这个这个问题挺蒙蔽的,所以先搁在这里吧

这个问题在今天早上解决了,既然他对微信中的ActivityResultLauncher方法冲突,那么我就换个api调用即可

并且定义一个请求码,用来标识即可,注意这个请求码有限制大小
package com.xiaojieyahu.top;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.graphics.Color;
import android.os.Build;
import androidx.appcompat.app.AppCompatActivity;

import com.example.myapplication.R;

public class PopupActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_IMPORT_ZIP = 289422;

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

        ImportZipButton importZipButton = findImportZipButton((ViewGroup) getWindow().getDecorView().getRootView());
        if (importZipButton != null) {
            importZipButton.setOnButtonClickListener(() -> {
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("application/zip");
                startActivityForResult(intent, REQUEST_CODE_IMPORT_ZIP);
            });
        }

        setSystemUI();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_IMPORT_ZIP && resultCode == RESULT_OK && data != null) {
            Uri uri = data.getData();
            ImportZipButton importZipButton = findImportZipButton((ViewGroup) getWindow().getDecorView().getRootView());
            if (importZipButton != null) {
                importZipButton.handleImportedZipFile(uri);
            }
        }
    }

    private ImportZipButton findImportZipButton(ViewGroup root) {
        for (int i = 0; i < root.getChildCount(); i++) {
            View child = root.getChildAt(i);
            if (child instanceof ImportZipButton) {
                return (ImportZipButton) child;
            } else if (child instanceof ViewGroup) {
                ImportZipButton result = findImportZipButton((ViewGroup) child);
                if (result != null) {
                    return result;
                }
            }
        }
        return null;
    }

    private void setSystemUI() {
        if (Build.VERSION.SDK_INT >= 21) {
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            getWindow().setNavigationBarColor(Color.TRANSPARENT);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
    }
}
重点说下,如何解决上下文注册实例的问题

放个例子吧

package com.xiaojieyahu.top;

import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;

import com.example.myapplication.R; // 确保这是正确的导入路径

public class PopupActivity extends AppCompatActivity {
    private ActivityResultLauncher<String> mGetContent = registerForActivityResult(
            new ActivityResultContracts.GetContent(),
            uri -> {
                // 通过tag找到ImportZipButton实例
                ImportZipButton importZipButton = (ImportZipButton) findViewById(android.R.id.content).findViewWithTag("xiaojieyahu");
                if (importZipButton != null) {
                    importZipButton.handleImportedZipFile(uri);
                }
            }
    );



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

        // 在这里不需要通过ID找到ImportZipButton,我们使用tag
        ImportZipButton importZipButton = (ImportZipButton) findViewById(android.R.id.content).findViewWithTag("xiaojieyahu");
        if (importZipButton != null) {
            // 设置ActivityResultLauncher
            importZipButton.setActivityResultLauncher(mGetContent);
        }
        if (Build.VERSION.SDK_INT >= 21) {
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            getWindow().setNavigationBarColor(Color.TRANSPARENT);
            getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
    }
}
最后修改:2024 年 03 月 10 日
如果觉得我的文章对你有用,请随意赞赏