我想在android中使用ViewStub,所以请帮帮我。我创建了
ViewStub stub = new ViewStub;
View inflated = stub.inflate();
如何以编程方式使用它?
答案 0 :(得分:108)
与documentation说的一样,ViewStub
是一个View
懒散地膨胀。
您可以在XML文件中声明ViewStub
,如下所示:
<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
android:layout
属性是对View
的引用,inflate()
会在ViewStub stub = (ViewStub) findViewById(R.id.stub);
View inflated = stub.inflate();
的调用旁边膨胀。所以
inflate()
调用方法ViewStub
后,View
将从其父级中移除,并替换为右侧mySubTree
(ViewStub stub = new ViewStub(this);
stub.setLayoutResource(R.layout.mySubTree);
stub.inflate();
布局的根视图)。
如果你想以程序方式执行此操作,那么您的代码应该是:
{{1}}
答案 1 :(得分:26)
只需使用ViewStub来提高渲染布局的效率。 通过使用ViewStub,可以创建手动视图,但不会将其添加到视图层次结构中。在运行时,可以很容易地膨胀,而ViewStub膨胀时,viewstub的内容将被替换为viewstub中定义的布局。
activity_main.xml我们定义了viewstub,但没有先创建。
简单的例子提供了更好的理解,
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="create the view stub" />
<Button
android:id="@+id/btn2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hide the stub." />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<ViewStub
android:id="@+id/stub_import"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:inflatedId="@+id/content_import"
android:layout="@layout/splash" />
</RelativeLayout>
</LinearLayout>
在运行时,当我们膨胀时,内容将被替换为viewstub中定义的布局。
public class MainActivity extends Activity {
Button b1 = null;
Button b2 = null;
ViewStub stub = null;
TextView tx = null;
int counter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1 = (Button) findViewById(R.id.btn1);
b2 = (Button) findViewById(R.id.btn2);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (stub == null) {
stub = (ViewStub) findViewById(R.id.stub_import);
View inflated = stub.inflate();
tx = (TextView) inflated.findViewById(R.id.text1);
tx.setText("thanks a lot my friend..");
}
}
});
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (stub != null) {
stub.setVisibility(View.GONE);
}
}
});
}
所以,让我们再看看视图层次结构,
当我们对viewstub进行充气时,它将从视图层次结构中删除。
答案 2 :(得分:1)
以下是在运行时显示/隐藏和更改ViewStub
数据的示例
<强> activity_main.xml中强>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/buttonShow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show View Stub"/>
<Button
android:id="@+id/buttonHide"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hide View Stub"/>
<ViewStub
android:id="@+id/viewStub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/layout_of_view_stub"
/>
</LinearLayout>
<强> layout_of_view_stub.xml 强>
<TextView
android:id="@+id/textInViewStub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ViewStub Button"
/>
<强> MainActivity.java 强>
public class MainActivity extends AppCompatActivity {
private ViewStub viewStub;
private Button buttonShow;
private Button buttonHide;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonShow = findViewById(R.id.buttonShow);
buttonHide = findViewById(R.id.buttonHide);
buttonShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showViewStub();
}
});
buttonHide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideViewStub();
}
});
}
private void showViewStub() {
if (viewStub == null) {
viewStub = findViewById(R.id.viewStub);
// If you want to change data of ViewStub at runtime, you can do like this
View inflatedView = viewStub.inflate();
TextView textViewInViewStub = inflatedView.findViewById(R.id.textInViewStub);
textViewInViewStub.setText("ABC");
}
viewStub.setVisibility(View.VISIBLE);
}
private void hideViewStub() {
if (viewStub == null) {
return;
}
viewStub.setVisibility(View.GONE);
}
}