上下文实例的问题以及解决思路
事发原因
当我在写用户点击按钮后启动文件管理器,选择文件并导入到指定目录里,获取权限也不说,他需要注册上下文实例才能实现,当我在自定义控件上实现的时候
他却移动到其他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);
}
}
}