如何在机器人中使用视图存根

我想在机器人中使用 ViewStub,所以请帮助我。我已经创建了

ViewStub stub = new ViewStub;
View inflated = stub.inflate();

如何以编程方式使用它?

74595 次浏览

正如 文件所说,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的引用,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();

只需使用 ViewStub 就可以提高呈现布局的效率。 通过使用 ViewStub,可以手动创建视图,但不能将其添加到视图层次结构中。在运行时,可以很容易地膨胀,当 ViewStub 膨胀时,ViewStub 的内容将被替换为 ViewStub 中已定义的布局。

Activity _ main.xml 我们定义了 viewstub,但是没有首先创建。enter image description here

简单的例子可以更好的理解,

<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>

在运行时,当我们充气时,内容将被视图存根中定义的布局所替换。

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);
}


}
});


}

enter image description here

那么,让我们再看看视图层次结构,

enter image description here

当我们膨胀视图存根时,它将被从视图层次结构中删除。

下面是一个在运行时显示/隐藏和更改 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>

Layof _ 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);
}
}