如何修改Android中通过<include>标签引入布局内的ImageView属性
实现步骤
第一步:给子布局内的ImageView添加唯一ID
首先修改你的@layout/titlebar子布局,给目标ImageView添加id属性,修改后代码如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/titlebar_bg" tools:showIn="@layout/activity_main" > <ImageView android:id="@+id/iv_title_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/gafricalogo" /> </FrameLayout>
第二步:代码中获取控件引用
分两种场景处理:
- 场景1:页面中只引入了一次该子布局
引入后的布局控件ID会自动合并到父布局的视图树中,直接在Activity/Fragment的视图加载完成后调用findViewById查找即可。
Activity中示例(Kotlin)
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 加载包含include标签的父布局 // 直接获取子布局内的ImageView val titleLogoIv = findViewById<ImageView>(R.id.iv_title_logo) // 拿到引用后即可修改属性,比如替换图片 titleLogoIv.setImageResource(R.drawable.new_logo) }
Activity中示例(Java)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView titleLogoIv = findViewById(R.id.iv_title_logo); titleLogoIv.setImageResource(R.drawable.new_logo); }
Fragment中示例
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val rootView = inflater.inflate(R.layout.fragment_parent, container, false) val logoIv = rootView.findViewById<ImageView>(R.id.iv_title_logo) return rootView }
- 场景2:同一页面多次引入同一个子布局
这种情况直接按ID查找会默认返回第一个子布局内的控件,需要先给每个include标签设置独立ID,先获取对应子布局的根视图,再从根视图中查找内部控件:
首先修改父布局中的include标签:
<include android:id="@+id/title_bar_1" layout="@layout/titlebar"/> <include android:id="@+id/title_bar_2" layout="@layout/titlebar"/>
然后代码中分层查找:
// 先获取第一个子布局的根视图 val titleBar1 = findViewById<FrameLayout>(R.id.title_bar_1) // 从第一个子布局里查找ImageView val logoIv1 = titleBar1.findViewById<ImageView>(R.id.iv_title_logo) // 第二个子布局同理 val titleBar2 = findViewById<FrameLayout>(R.id.title_bar_2) val logoIv2 = titleBar2.findViewById<ImageView>(R.id.iv_title_logo)
内容的提问来源于stack exchange,提问作者Sparsh Dutta
相关产品推荐
相关产品推荐

