【问题标题】:android data binding. How to access view via ID inside a included layout安卓数据绑定。如何在包含的布局中通过 ID 访问视图
【发布时间】:2016-12-22 11:56:57
【问题描述】:

我的布局包括一些布局。 其中一个有一个progressBar,我想使用数据绑定来访问它,但我不能。

<?xml version="1.0" encoding="utf-8"?>
<layout 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"
    >
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:splitMotionEvents="true"
        tools:context="jp.co.sakony.activities.DiaryNewArticleActivity"
        >

    <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            style="@style/ToolBar"
            />

    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >

        <ScrollView
                android:id="@+id/diary_new_article_scrollView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fillViewport="true"
                >

            <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="@dimen/margin_medium"
                    android:layout_marginRight="@dimen/margin_medium"
                    android:orientation="vertical"
                    android:splitMotionEvents="true"
                    >

                <jp.co.sakony.views.contents.InputFieldDescriptionView
                        android:id="@+id/diary_new_article_input_title_description"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="@dimen/margin_medium"
                        app:input_field_maxLength="@integer/diary_new_article_title_max_length"
                        app:input_field_required="true"
                        app:input_field_title="@string/diary_new_article_input_title"
                        />

                <android.support.design.widget.TextInputLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="-10dp"
                        app:counterEnabled="true"
                        app:counterMaxLength="@integer/diary_new_article_title_max_length"
                        app:counterTextAppearance="@style/counterText"
                        app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout"
                        >
                    <jp.co.sakony.views.APEditText
                            android:id="@+id/diary_new_article_input_title"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:inputType="text"
                            android:maxLength="@integer/diary_new_article_title_max_length"
                            android:maxLines="1"
                            android:textCursorDrawable="@drawable/shape_edit_cursor_orange"
                            app:textLineColor="@color/orange"
                            />

                </android.support.design.widget.TextInputLayout>

                <jp.co.sakony.views.contents.InputFieldDescriptionView
                        android:id="@+id/diary_new_article_input_body_description"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="@dimen/margin_medium"
                        app:input_field_maxLength="@integer/diary_new_article_body_max_length"
                        app:input_field_required="true"
                        app:input_field_title="@string/diary_new_article_input_body"
                        />

                <android.support.design.widget.TextInputLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="-10dp"
                        app:counterEnabled="true"
                        app:counterMaxLength="@integer/diary_new_article_body_max_length"
                        app:counterTextAppearance="@style/counterText"
                        app:hintTextAppearance="@style/TextAppearence.App.TextInputLayout"
                        >
                    <jp.co.sakony.views.APEditText
                            android:id="@+id/diary_new_article_input_body"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:maxLength="@integer/diary_new_article_body_max_length"
                            android:scrollbars="vertical"
                            android:textCursorDrawable="@drawable/shape_edit_cursor_orange"
                            app:textLineColor="@color/orange"
                            />

                </android.support.design.widget.TextInputLayout>

                <jp.co.sakony.views.contents.InputFieldDescriptionView
                        android:id="@+id/diary_new_article_input_allow_comment_description"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="@dimen/margin_medium"
                        app:input_field_explanation="@string/diary_new_article_input_allow_comment_explanation1"
                        app:input_field_required="true"
                        app:input_field_title="@string/diary_new_article_input_allow_comment"
                        />

                <android.support.v7.widget.SwitchCompat
                        android:id="@+id/diary_new_article_input_allow_comment"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="@dimen/margin_medium"
                        android:background="@drawable/selector_comment_reply_background"
                        android:checked="true"
                        android:padding="@dimen/margin_small"
                        android:text="@string/diary_new_article_allow_comment_switch_on"
                        android:textSize="@dimen/font_small"
                        android:theme="@style/AllowCommentSwitch"
                        />

            </LinearLayout>

        </ScrollView>

        <include layout="@layout/toolbar_shadow"/>

        <include
                layout="@layout/progress_bar_masked"
                android:id="@+id/progress"
                />

    </FrameLayout>

</LinearLayout>

progress_bar_masked.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout
        android:id="@+id/progressbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/transparent_grey"
        android:clickable="true"
        >

    <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            style="?android:attr/progressBarStyle"
            />

</RelativeLayout>

活动

abstract public class BaseDiaryArticleActivity extends AppCompatActivity implements View.OnClickListener, TextWatcher,
    DialogOkCancelFragment.DialogOKCancellCallback {

protected ActivityBaseDiaryArticleBinding mBinding;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_base_diary_article);

    // can't find progressbar.
    mBinding.progress.progressbar
}

mBinding.progress 返回视图。 但我认为它应该返回 ProgressBarMaskedBinding。

更新

我解决了这个问题。

progress_bar_masked.xml 位于库项目中。 现在我将此布局移动到应用程序项目中并且它正在工作。 也许这是一个数据绑定错误,不是吗?

【问题讨论】:

  • 你为什么不试试 findViewById() 它可以用它来完成
  • 谢谢@MohamamdFatemi。我知道 findViewById() 有效。但是数据绑定可以排除任何 findViewById() 并且可以简化代码。所以我重构了这段代码。
  • 它应该是这样工作的,它看起来是正确的。所以也许你需要重建你的项目。或者 可能是问题所在。
  • 谢谢@tynn。我多次重建我的项目。但它不起作用。我可以找到生成的 ProgressBarMaskedBinding.java。但是 ActivityBaseDiaryArticleBinding 无法访问它。
  • 仍然是 是什么意思或为什么存在的问题?如果它是您布局的一部分,则应将其删除。

标签: android data-binding include


【解决方案1】:

你必须给你的包含一个 ID:

    <include android:id="@+id/toolShadow" layout="@layout/toolbar_shadow"/>

然后通过包含的绑定访问包含的布局中的视图:

mBinding.toolShadow.progressbar.setProgress(100);

【讨论】:

  • 谢谢@George。我想访问 progress_bar_masked.xml 中的视图。我给了 ID android:id="@+id/progress"。你的意思是所有包含的布局都需要 ID?
  • 是的。包含标记在外部绑定类(在您的情况下为 ActivityBaseDiaryArticalBinding)中生成一个绑定字段(在您的情况下为 ProgressBarMaskedBinding)。当你给它一个 ID 时,绑定系统会将它变成一个公共字段。如果您不这样做,它会使用私有字段并为其使用内部名称。例如,您可以在同一布局中多次包含同一布局,这样您就可以单独访问每个布局。
  • 我更新了我的问题。我想也许这是一个错误。谢谢。
  • 当包含的布局在库中时,您是否尝试编译项目?我想知道这是工作室问题还是 gradle 问题。另外,您是否在包含的库中启用了数据绑定?
  • @VikasPandey - Yigit 和我为 Android 编写了数据绑定。
【解决方案2】:

你必须给包含一个ID,并且在包含的文件中实现数据绑定作为添加: &lt;layout xmlns:android="http://schemas.android.com/apk/res/android"&gt; 那么您将能够从包含的布局文件中访问视图

【讨论】:

    【解决方案3】:

    您必须将包含的视图包装在layout 标记中

    <layout xmlns:android="http://schemas.android.com/apk/res/android">
    </layout>
    

    然后您可以像ActivityMainBinding.parentview.innerview; 一样访问它们 希望它可以帮助某人。

    【讨论】:

      猜你喜欢
      • 2016-01-20
      • 2020-07-05
      • 2021-05-16
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多