DataBindingUtil.setContentView(@NonNull Activity activity, int layoutId) return null

本文探讨了在项目中遇到DataBindingUtil.setContentView返回null的问题,焦点在于lib包与app包名一致导致的识别问题,提供了修复方案以确保正确绑定布局。

修复DataBindingUtil.setContentView(@NonNull Activity activity, int layoutId) 返回null 的问题:

lib 包中的AndroidManifest package 包名和app 中AndroidManifest 包名一致,导致识别失败,没有返回对应binding.

package com.gykj.towerCraneController.databinding; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.databinding.Bindable; import androidx.databinding.DataBindingUtil; import androidx.databinding.ViewDataBinding; import com.gykj.towerCraneController.model.TowerCraneViewModel; import com.gykj.towerCraneController.view.CTowerCraneView; import java.lang.Deprecated; import java.lang.Object; public abstract class FragmentAntiCollisionAvoidanceBinding extends ViewDataBinding { @NonNull public final LinearLayout bottomInfoLayout; @NonNull public final CTowerCraneView towerCraneView; @Bindable protected TowerCraneViewModel mViewModel; protected FragmentAntiCollisionAvoidanceBinding(Object _bindingComponent, View _root, int _localFieldCount, LinearLayout bottomInfoLayout, CTowerCraneView towerCraneView) { super(_bindingComponent, _root, _localFieldCount); this.bottomInfoLayout = bottomInfoLayout; this.towerCraneView = towerCraneView; } public abstract void setViewModel(@Nullable TowerCraneViewModel viewModel); @Nullable public TowerCraneViewModel getViewModel() { return mViewModel; } @NonNull public static FragmentAntiCollisionAvoidanceBinding inflate(@NonNull LayoutInflater inflater, @Nullable ViewGroup root, boolean attachToRoot) { return inflate(inflater, root, attachToRoot, DataBindingUtil.getDefaultComponent()); } /** * This method receives DataBindingComponent instance as type Object instead of * type DataBindingComponent to avoid causing too many compilation errors if * compilation fails for another reason. * https://issuetracker.google.com/issues/116541301 * @Deprecated Use DataBindingUtil.inflate(inflater, R.layout.fragment_anti_collision_avoidance, root, attachToRoot, component) */ @NonNull @Deprecated public static FragmentAntiCollisionAvoidanceBinding inflate(@NonNull LayoutInflater inflater, @Nullable ViewGroup root, boolean attachToRoot, @Nullable Object component) { return ViewDataBinding.<FragmentAntiCollisionAvoidanceBinding>inflateInternal(inflater, com.gykj.towerCraneController.R.layout.fragment_anti_collision_avoidance, root, attachToRoot, component); } @NonNull public static FragmentAntiCollisionAvoidanceBinding inflate(@NonNull LayoutInflater inflater) { return inflate(inflater, DataBindingUtil.getDefaultComponent()); } /** * This method receives DataBindingComponent instance as type Object instead of * type DataBindingComponent to avoid causing too many compilation errors if * compilation fails for another reason. * https://issuetracker.google.com/issues/116541301 * @Deprecated Use DataBindingUtil.inflate(inflater, R.layout.fragment_anti_collision_avoidance, null, false, component) */ @NonNull @Deprecated public static FragmentAntiCollisionAvoidanceBinding inflate(@NonNull LayoutInflater inflater, @Nullable Object component) { return ViewDataBinding.<FragmentAntiCollisionAvoidanceBinding>inflateInternal(inflater, com.gykj.towerCraneController.R.layout.fragment_anti_collision_avoidance, null, false, component); } public static FragmentAntiCollisionAvoidanceBinding bind(@NonNull View view) { return bind(view, DataBindingUtil.getDefaultComponent()); } /** * This method receives DataBindingComponent instance as type Object instead of * type DataBindingComponent to avoid causing too many compilation errors if * compilation fails for another reason. * https://issuetracker.google.com/issues/116541301 * @Deprecated Use DataBindingUtil.bind(view, component) */ @Deprecated public static FragmentAntiCollisionAvoidanceBinding bind(@NonNull View view, @Nullable Object component) { return (FragmentAntiCollisionAvoidanceBinding)bind(component, view, com.gykj.towerCraneController.R.layout.fragment_anti_collision_avoidance); } } 给新手解析这段代码
最新发布
11-21
public abstract class HwRecyclerPagerAdapter extends HwPagerAdapter { private static final int CACHE_SIZE = 5; private SparseArray<List<ViewHolder>> caches = new SparseArray<>(); public abstract ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType); public abstract void onBindViewHolder(@NonNull ViewHolder holder, int position); public int getItemViewType(int position) { return 0; } public abstract void onViewRecycled(@NonNull ViewHolder holder); @NonNull @Override public Object instantiateItem(@NonNull ViewGroup viewGroup, int position) { int viewType = getItemViewType(position); //todo 从缓存取 ViewHolder holder = caches.get(viewType).get(0);//fixme 实例代码 if (holder == null) { holder = onCreateViewHolder(viewGroup, position); holder.viewType = viewType; holder.root.setTag(android.R.id.content, holder); } if (holder.root.getParent() != null) { throw new IllegalStateException("ViewHolder views must not be attached when created. "); } onBindViewHolder(holder, position); viewGroup.addView(holder.root); return holder.root; } @Override public void destroyItem(@NonNull ViewGroup viewGroup, int i, @NonNull Object object) { if (!(object instanceof View)) { // log return; } View root = (View) object; ViewHolder holder = (ViewHolder) root.getTag(android.R.id.content); onViewRecycled(holder); List<ViewHolder> queue = caches.get(holder.viewType); if (queue == null) { queue = new ArrayList<>(CACHE_SIZE); } // todo 这里做缓存管理 } public abstract static class ViewHolder { protected int viewType; @NonNull protected View root; public ViewHolder(@NonNull View root) { this.root = root; } } }把上个代码优化成他这样
09-29
package com.example.mymouleb; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; import java.util.ArrayList; import java.util.List; import android.view.ViewGroup; import androidx.annotation.NonNull; public class LauncherActivity extends AppCompatActivity { private ViewPager viewPager; private TabLayout tabLayout; private GuidePageAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_launcher); viewPager = findViewById(R.id.viewPager); tabLayout = findViewById(R.id.tabLayout); // 准备引导页图片资源ID列表 List<Integer> imageResIds = new ArrayList<>(); imageResIds.add(R.drawable.page1); // 替换为实际图片资源ID imageResIds.add(R.drawable.page2); imageResIds.add(R.drawable.page3); adapter = new GuidePageAdapter(imageResIds); viewPager.setAdapter(adapter); tabLayout.setupWithViewPager(viewPager); // 设置第一个小圆点为实心白色(选中状态) tabLayout.getTabAt(0).select(); } public class GuidePageAdapter extends PagerAdapter { private final List<Integer> imageResIds; // 图片资源ID列表 public GuidePageAdapter(List<Integer> imageResIds) { this.imageResIds = imageResIds; } @Override public int getCount() { return imageResIds != null ? imageResIds.size() : 0; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { // 加载布局的正确方式:第三个参数必须为false View itemView = LayoutInflater.from(container.getContext()) .inflate(R.layout.page_layout, container, false); ImageView imageView = itemView.findViewById(R.id.guide_image); imageView.setImageResource(imageResIds.get(position)); container.addView(itemView); // 必须手动添加视图 return itemView; // 返回的Object必须是页面视图对象 } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { // 强制类型转换并移除视图 container.removeView((View) object); } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { // 判断视图是否来自instantiateItem返回的对象 return view == object; } } }给这个代码的结果页面上加上引导页指示器,且在下方显示三个小圆点,在第一页时圆点为白色,其余圆点为透明色,第二页用理,到第三页时不显示小圆点,添加一个开启按钮,点击后跳转到LoginActivity
05-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值