如何在视图中存储对另一个视图的引用?

时间:2019-02-22 12:48:18

标签: android

我正在尝试使“信息”文本视图具有可扩展的内容。用户会看到一个显示“信息”的文本视图,单击/点击时,会出现另一个包含该信息的文本视图(直到现在一直隐藏)。

这是XML:

<!-- Information expandable block-->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/element_background"
            android:orientation="vertical"
            android:layout_marginTop="@dimen/home_screen_elements_spacing">
            <!-- Information block title -->
            <TextView
                android:id="@+id/app_schedule_fri_information"
                android:tag="app_schedule_fri_information_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="20dp"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="20dp"
                android:layout_marginRight="20dp"
                android:layout_marginBottom="8dp"
                style="@style/AppTheme"
                android:text="@string/app_home_information"
                android:textColor="@color/colorTextBody"
                android:background="@android:color/transparent"
                android:clickable="true"
                android:focusable="true"
                android:onClick="toggle_contents"/>
            <!-- Information block content to hide/show -->
            <TextView
                android:id="@+id/app_schedule_fri_information_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="15dp"
                android:layout_marginLeft="20dp"
                android:layout_marginTop="8dp"
                android:layout_marginEnd="15dp"
                android:layout_marginRight="20dp"
                android:layout_marginBottom="8dp"
                android:background="@android:color/transparent"
                style="@style/AppTheme"
                android:text="@string/app_home_information_text"
                android:textColor="@color/colorTextBody"/>
        </LinearLayout>

这是单击时调用的“ toggle_content”函数:

public void toggle_contents(View v){
    TextView content = <GET_REF_TO_CONTENT>;
    content.setVisibility( content.isShown()
            ? View.GONE
            : View.VISIBLE );
}

我需要什么

如您所见,我被困住了。我正在寻找一种在标题Textview中存储对内容Textview的引用的方法。调用后,toggle_content()将从标题视图中恢复该引用(例如v.getTag()),并使用它来定位内容并进行切换。

我尝试过的事情:

我试图将内容textview的ID存储在标题textview的标签中(实际上存在于上述xml中),但是未能将标签转换为ID。

3 个答案:

答案 0 :(得分:0)

那不是很性感,但是很有效:

public void toggle_contents(View v){
    int id = getResources().getIdentifier(v.getTag().toString(), "id", this.getPackageName());
    TextView content = findViewById(id);
    content.setVisibility( content.isShown()
            ? View.GONE
            : View.VISIBLE );
}

希望有人可以提供更好的答案,因为这看起来像是将来的更新可能会破解的黑客。

答案 1 :(得分:0)

通过将第一个文本视图的可见性设置为VISIBLE / GONE,在第一个文本视图上使用单击侦听器,并通过切换使其第二个显示/消失:

TextView information = (TextView) findViewById(R.idapp_schedule_fri_information);
TextView informationText = (TextView) findViewById(app_schedule_fri_information_text);

information.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (informationText.isVisible()) {
                   informationText.setVisibility(View.GONE); 
                } else {
                   informationText.setVisibility(View.VISIBLE);
                }
            }
        });

答案 2 :(得分:0)

您不需要ID。
如果您已经将informationText的引用存储在information的标签中,例如:

information.setTag(informationText);

然后您可以像这样检索它:

public void toggle_contents(View v){
    TextView content = ((TextView) v).getTag();
    content.setVisibility( content.isShown()
            ? View.GONE
            : View.VISIBLE );
}

因此,除了将tag的名称存储在TextView中之外,您可以存储对TextView本身的引用,而不必费心查找其ID。