在使用视图绑定时,我遇到了几个未记录的情况。
第一:如何获取包含的视图布局部分的绑定?主要的绑定只能看到在主布局中定义的项目。
第二:如何获取合并布局部分的绑定。同样,主要的绑定只能看到主布局中的项目?
在使用视图绑定时,我遇到了几个未记录的情况。
第一:如何获取包含的视图布局部分的绑定?主要的绑定只能看到在主布局中定义的项目。
第二:如何获取合并布局部分的绑定。同样,主要的绑定只能看到主布局中的项目?
如果出现以下情况:
<include
android:id="@+id/your_id"
layout="@layout/some_layout" />
在您的活动代码中,可以这样写:
答案:在您的活动代码中这样写:private lateinit var exampleBinding: ActivityExampleBinding //activity_example.xml layout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
setContentView(exampleBinding.root)
//we will be able to access included layouts view like this
val includedView: View = exampleBinding.yourId.idOfIncludedView
//[...]
}
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/activity_example">
<TextView
android:id="@+id/some_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World" />
</merge>
为了正确绑定此合并布局,我们需要:
在您的活动代码中:
private lateinit var exampleBinding: ActivityExampleBinding //activity_example.xml layout
private lateinit var mergeBinding: MergeLayoutBinding //merge_layout.xml layout
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
//we need to bind the root layout with our binder for external layout
mergeBinding = MergeLayoutBinding.bind(exampleBinding.root)
setContentView(exampleBinding.root)
//we will be able to access included in merge layout views like this
val mergedView: View = mergeBinding.someView
//[...]
}
layout
标签。 - João Carlosval binding = FrgamentSomethingSomething.inflate(layoutInflater)
和 return binding.root
- Artur Kasprzak关于您的第一个问题,您可以为包含的布局获取视图绑定。
这是一个示例 main_fragment.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_main"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />
</LinearLayout>
而 MainFragment.java
可以像这样:
public class MainFragment extends Fragment {
private MainFragmentBinding binding;
private ToolbarBinding toolbarBinding;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
binding = MainFragmentBinding.inflate(inflater, container, false);
toolbarBinding = binding.toolbar;
return binding.getRoot();
}
@Override
public void onDestroy() {
super.onDestroy();
toolbarBinding = null;
binding = null;
}
}
现在你有两个绑定:一个对应主布局,另一个对应包含的布局。
onCreate()
中都可以工作。谢谢。(只是在使用DrawerLayout
时遇到了一些麻烦) - Fat MonktoolbarBinding = binding.toolbar as ToolbarBinding
),否则它会被视为 View
并出现错误。奇怪的是,使用 binding.toolbar.something
将编译并运行良好,但在 AS 中显示为错误。 - CodeClown42如果您想要绑定包含的布局,则
对于Activity
YourMainLayoutBinding mainLayoutBinding = MainLayoutBinding.inflate(getLayoutInflater);
View view = mainLayoutBinding.getRoot();
YourIncludedLayoutBinding includedLayoutBinding = YourIncludedLayoutBinding.bind(View);
片段化编程
YourMainLayoutBinding mainLayoutBinding = MainLayoutBinding.inflate(inflater,container,false);
View view = mainLayoutBinding.getRoot();
YourIncludedLayoutBinding includedLayoutBinding = YourIncludedLayoutBinding.bind(View);
确保您的主布局绑定父根是LinearLayout,那么includedLayoutBinding父布局也应该是一个线性布局。<include android:id="@+id/myToolbar" layout="@layout/toolbar" />
。之后,字段mainLayoutBinding.myToolbar
将包含一个嵌套绑定。 - Dmitry KCannot access class 'x'. Check your module classpath for missing or conflicting dependencies
。 - Michał Dobi Dobrzański假设我在我的activity_main.xml
文件中包含了以下布局:
<include
android:id="@+id/ll_layout1"
layout="@layout/layout1"
android:visibility="gone" />
假设我想改变它的可见性。我可以按以下方式操作:
activityMainBinding.llLayout1.root.visibility = View.VISIBLE
rootView
代替,我认为它是相同的。 - bobby I.getRoot()
来实现相同的效果。 - shivanginclude
标签分配id
。id
后,您将能够获取绑定对象,如下所示:YourMainLayoutBinding.YourIncludeTagIDLayoutBinding
回答你关于片段的第一个问题,假设你在MainFragment的xml文件中包含了一个"error_layout"。
<include
layout="@layout/error_layout"
android:id="@+id/layout_error"
android:visibility="gone"/>
binding.layoutError.btnTryAgain
请按照以下步骤操作:
private val binding : FragmentBinding
by viewBinding(FragmentBinding::bind)
make sure to do the following in "onViewCreated(view: View, savedInstanceState: Bundle?)"
val binding2 = binding.root.include_layout_id
val binding2 = binding.root.tool_bar_layout
binding2.textView.text = "your text"
<layout>
标签包装您的XML布局。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
...
<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />
...
</LinearLayout>
</layout>
toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/ivImage"
... />
<TextView
android:id="@+id/tvTitle"
... />
</LinearLayout>
MainActivity.kt
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// Access include layout views
binding.toolbar.rootView.ivImage.setImageResource(R.drawable.ic_back_arrow)
binding.toolbar.rootView.tvTitle.text = getString(R.string.home)
...
}
<androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/example"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent">
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>