在 Fragment.xml Android 应用程序开发中引用时,自定义视图不会从 XML 扩展
Custom view does not inflate from XML when referenced in Fragment.xml Android Application Development
我在 Android 中创建了一个自定义视图,我们称它为 MyCustomView,它的 XML 文件是 MyCustomView.xml。我在一个片段中引用了 MyCustomView,我们称它为 MyFragment 和 MyFragment.xml。该参考仅是 XML 参考而非代码。当我的片段膨胀时,它使用 MyFragment.xml 膨胀。然后我可以检索指向视图的指针。这是我的问题。一切都按预期工作,除了 MyCustomView 没有从 MyCustomView.xml 膨胀,因此,在屏幕上可以看到 MyCustomView.xml 中定义的 none 按钮或布局。我可能做错了什么?如何使 MyFragment.xml 中的 XML 引用膨胀为 MyCustomView.xml?
MyFragment.xml
<FrameLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.domain.MyFragment"
android:id="@+id/MyFragment">
<com.domain.MyCustomView
android:id="@+id/MyCustomView"
android:background="@android:color/transparent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
</com.domain.MyCustomView>
</FrameLayout>
MyCustomView.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_gravity="bottom"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btnCancel"
android:layout_width="200dp"
android:layout_height="100dp"
android:text="Cancel"
android:layout_weight="1" />
<Button
android:id="@+id/btnNext"
android:layout_width="200dp"
android:layout_height="100dp"
android:text="Next"
android:layout_weight="1" />
</LinearLayout>
</FrameLayout>
MyFragment.java
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_signature_capture, container, false);
myCustomView = (MyCustomView) v.findViewById(R.id.signatureView);
//At this point I would like to be able to
//access my buttons declared in MyCustomView.xml
//via the following call
Button b1 = (Button) myCustomView.findViewById(R.id.btnCancel);
//The above line returns null because it cant find the view.
return v ;
}
如果您已经为其定义了一个源文件 (java),并且该文件是 View
class 的子文件,则您只能在 xml 中使用自定义视图或其任何后代。由于您只定义了一个自定义布局,没有构造函数,因此它不能像 View
那样膨胀。你应该改变:
<com.domain.MyCustomView
android:id="@+id/MyCustomView"
android:background="@android:color/transparent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
</com.domain.MyCustomView>
与:
<include
layout=@layout/MyCustomView
android:id="@+id/MyCustomView"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</include>
然后将此属性移动到您的 MyCustomView.xml
根 FrameLayout
android:background="@android:color/transparent"
我在 Android 中创建了一个自定义视图,我们称它为 MyCustomView,它的 XML 文件是 MyCustomView.xml。我在一个片段中引用了 MyCustomView,我们称它为 MyFragment 和 MyFragment.xml。该参考仅是 XML 参考而非代码。当我的片段膨胀时,它使用 MyFragment.xml 膨胀。然后我可以检索指向视图的指针。这是我的问题。一切都按预期工作,除了 MyCustomView 没有从 MyCustomView.xml 膨胀,因此,在屏幕上可以看到 MyCustomView.xml 中定义的 none 按钮或布局。我可能做错了什么?如何使 MyFragment.xml 中的 XML 引用膨胀为 MyCustomView.xml?
MyFragment.xml
<FrameLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.domain.MyFragment"
android:id="@+id/MyFragment">
<com.domain.MyCustomView
android:id="@+id/MyCustomView"
android:background="@android:color/transparent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
</com.domain.MyCustomView>
</FrameLayout>
MyCustomView.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_gravity="bottom"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/btnCancel"
android:layout_width="200dp"
android:layout_height="100dp"
android:text="Cancel"
android:layout_weight="1" />
<Button
android:id="@+id/btnNext"
android:layout_width="200dp"
android:layout_height="100dp"
android:text="Next"
android:layout_weight="1" />
</LinearLayout>
</FrameLayout>
MyFragment.java
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_signature_capture, container, false);
myCustomView = (MyCustomView) v.findViewById(R.id.signatureView);
//At this point I would like to be able to
//access my buttons declared in MyCustomView.xml
//via the following call
Button b1 = (Button) myCustomView.findViewById(R.id.btnCancel);
//The above line returns null because it cant find the view.
return v ;
}
如果您已经为其定义了一个源文件 (java),并且该文件是 View
class 的子文件,则您只能在 xml 中使用自定义视图或其任何后代。由于您只定义了一个自定义布局,没有构造函数,因此它不能像 View
那样膨胀。你应该改变:
<com.domain.MyCustomView
android:id="@+id/MyCustomView"
android:background="@android:color/transparent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
</com.domain.MyCustomView>
与:
<include
layout=@layout/MyCustomView
android:id="@+id/MyCustomView"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</include>
然后将此属性移动到您的 MyCustomView.xml
根 FrameLayout
android:background="@android:color/transparent"