inflate自定义attr报错的解决方法

原文地址 :  http://blog.csdn.net/consoar/article/details/16106187

近段时间,写了一下多主题支持的软件,用的是Theme+自定义Attr实现的,但是我用的是Fragment,需要inflate,但我发现我直接获取LayoutInflater进行inflate会报错,所以查阅了一下资料,得出要用setTheme过的Activity进行获取,所以我用如下方法实现了

有一个全局的Application叫MyApplication,然后有一个setTheme过的Activity

Application中有两个static方法

[java]  view plain  copy
  1. public static void setActivity(Activity activity) {  
  2.     MyApplication.activity = activity;  
  3. }  
[java]  view plain  copy
  1. public static LayoutInflater getLayoutInflater() {  
  2.     if (layoutInflater == null) {  
  3.         layoutInflater = getActivity().getLayoutInflater();  
  4.     }  
  5.     return layoutInflater;  
  6. }  

在Activity中进行setTheme之后调用MyApplication.setActivity(this);进行初始化,以后只要使用MyApplication.getLayoutInflater()得到的LayoutInflater进行inflate就行了。

哦顺便加上获取对应主题颜色值的代码

[java]  view plain  copy
  1. public static int getColor(int attr) {  
  2.     int[] attrs = new int[]{attr};  
  3.     Context context = MyApplication.getActivity();  
  4.     TypedArray ta = context.obtainStyledAttributes(attrs);  
  5.     return ta.getColor(0430);  
  6.   
  7. }  

在Android中,当你在Fragment中尝试访问`requireActivity()`方法并遇到错误时,这通常是由于以下几个原因: 1. **生命周期问题**:确保你在正确的时间调用了该方法。通常,你应该在`onCreateView()`、`onActivityCreated()`或者`viewCreated()`这样的生命周期回调中使用它。 ```java @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (activity != null) { // 在这里 activity 可能还没有被设置,所以你可以先检查一下 MyFragment fragment = new MyFragment(); fragment.activity = getActivity(); // 如果需要在fragment中保存对activity的引用 return inflater.inflate(R.layout.fragment_my, container, false); } return null; } ``` 2. **丢失上下文**:如果你是在静态创建Fragment时出现问题,确保将Fragment添加到了Activity或支持FragmentManager中。 ```java SupportFragmentManager fragmentManager = requireActivity().getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); MyFragment myFragment = new MyFragment(); transaction.add(R.id.container, myFragment).commit(); ``` 3. **混淆配置错误**:检查build.gradle文件中的proguard配置,确保不会意外地移除了`androidx.appcompat.widget.AppCompatDelegate`或类似依赖中的相关类,因为`requireActivity()`依赖于它们。 4. **版本兼容性**:如果使用了旧版的Android API,确保更新到支持`requireActivity()`的新版本,如AndroidX库或较新的Android SDK。 5. **异常追踪**:查看错误日志,看看是否有具体的堆栈跟踪,以便找到报错的具体位置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值