android layout 替换,LayoutInflater 后记--替换系统控件

之前记录了自己走通 LayoutInflater 的源码整体流程,一直想搞个好玩的东西,想起之前看到过的换肤方案,决定写个换系统控件的库。

项目地址,项目的具体使用,可以看README

首先需要确定,LayoutInflater对于Android自带的view读入的名字是没有全名的,具体创建的时候是通过写上前缀,然后借助反射进行实例化的

举例:

...

/>

作为xml读入以后,是只有TextView的

....

/>

作为xml读入后,是整个名字存在的,即dove.flyer.xu.mineView,具体细节[前面文章]()已经叙述了,此处不重复了

明确,Factory如果可以构建view对象的话,后面的view实例化操作是不会被进行的。

首先定位到createViewFromTag。

源码中,以Factory为例子,如果Factory为空的时候,是不会执行里面代码的,如果设置了,则会执行。而执行后,如果view不为空,则下面的view创建都会失效,也就是说,如果Factory创建成功了view,那么后面创建view部分的代码并不会执行。Facory2也同理。

而Factory和Factory2在一开始就是空的,只需要设置好这个Factory,那具体的view创建就会被它俩其中一个接手。

View createViewFromTag(View parent, String name, AttributeSet attrs, boolean inheritContext){

....

if (mFactory2 != null) {

view = mFactory2.onCreateView(parent, name, viewContext, attrs);

} else if (mFactory != null) {

view = mFactory.onCreateView(name, viewContext, attrs);

} else {

view = null;

}

if(view == null ...){

...

}

if(view == null ...){

...

}

....

}

明确Factory是可以被set进去的

调用getLayoutInflater().setFactory(factory)即可

剩下的就是考虑Activity会在何时才会创建view,自然是setContentView(R.layout_aa.xml),该方法会触发整个对应layout.xml的inflate

所以剩下的就是在onCreate的时候,在setContentView之前,把自己的Factory给设置进去,把传进来的名字,修改成自己的view就可以了。

以上三点拼在一起就可以进行系统控件的同意替换,具体Factory重写的细节请参考源码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio中加入RecyclerView-v7的步骤如下: 1.在app/build.gradle文件中添加以下依赖项: ```gradle dependencies { implementation 'com.android.support:recyclerview-v7:28.0.0' } ``` 2.同步Gradle文件,以便将RecyclerView库添加到项目中。 3.在布局文件中添加RecyclerView视图: ```xml <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 4.在代码中初始化RecyclerView并设置布局管理器和适配器: ```java // 初始化RecyclerView RecyclerView recyclerView = findViewById(R.id.recycler_view); // 设置布局管理器 recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 设置适配器 recyclerView.setAdapter(new MyAdapter()); ``` 5.创建适配器类并继承RecyclerView.Adapter类,并实现必要的方法: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { // 创建ViewHolder @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_view, parent, false); return new MyViewHolder(itemView); } // 绑定ViewHolder @Override public void onBindViewHolder(MyViewHolder holder, int position) { // 设置数据 } // 获取数据数量 @Override public int getItemCount() { return 0; } // 创建ViewHolder类 public class MyViewHolder extends RecyclerView.ViewHolder { public MyViewHolder(View itemView) { super(itemView); // 初始化件 } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值