当前位置: 首页 > 面试题库 >

Android:具有现有布局的自定义视图的多个视图子级

锺离伟彦
2023-03-14
问题内容

我必须在Android中构建更复杂的自定义视图。最终布局应如下所示:

<RelativeLayout>
  <SomeView />
  <SomeOtherView />
  <!-- maybe more layout stuff here later -->
  <LinearLayout>
    <!-- the children -->
  </LinearLayout>
</RelativeLayout>

但是,我只想在XML文件中定义它(不定义SomeView,SomeOtherView等):

<MyCustomView>
  <!-- the children -->
</MyCustomView>

这在Android中可行吗?如果可以,那么最干净的方法是什么?我想到的可能解决方案是“重写addView()方法”和“删除所有视图并在以后再次添加它们”,但是我不确定该走哪条路…

在此先感谢您的帮助!:)


问题答案:

绝对有可能并且鼓励创建自定义容器视图。这就是Android所谓的复合控件。所以:

public class MyCustomView extends RelativeLayout {
    private LinearLayout mContentView;

    public MyCustomView(Context context) {
        this(context, null);
    }

    public MyCustomView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        //Inflate and attach your child XML
        LayoutInflater.from(context).inflate(R.layout.custom_layout, this);
        //Get a reference to the layout where you want children to be placed
        mContentView = (LinearLayout) findViewById(R.id.content);

        //Do any more custom init you would like to access children and do setup
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        if(mContentView == null){
            super.addView(child, index, params);
        } else {
            //Forward these calls to the content view
            mContentView.addView(child, index, params);
        }
    }
}

您可以根据需要覆盖尽可能多的版本addView(),但最后它们都会回调到我在样本中放置的版本。仅重写此方法将使框架将在XML标记内找到的所有子代传递给特定的子代容器。

然后像这样修改XML:

RES /布局/custom_layout.xml

<merge>
  <SomeView />
  <SomeOtherView />
  <!-- maybe more layout stuff here later -->
  <LinearLayout
      android:id="@+id/content" />
</merge>

使用的原因<merge>是简化层次结构。所有子视图都将附加到您的自定义类(即)上RelativeLayout。如果不使用<merge>,则最终会在所有子项上RelativeLayout附加一个RelativeLayout附加项,这可能会引起问题。

高温超导



 类似资料:
  • 我有一个片段,我想在其中使用折叠工具栏布局 当collapsing_toolbar展开时,我希望显示图像,当折叠时,我希望只有@id/custom_layout。custom_layout是一个带有文本视图和图像视图的相对布局。 我想要有完全相同的行为,就像我有以下行为一样: 而不是自定义布局。 为什么这是不工作?即使折叠ToobarLayout扩展我看到的ImageView和自定义布局。 !!注

  • 我遇到了自动布局的问题,似乎无法找到应该很容易实现的答案。 我有以下视图层次结构: 标签上的前导/尾随限制使它们在更薄的设备上更高(iPhone 4s vs iPhone 6)。 为了让UIScrollview正常工作,我需要在UIScrollView内部设置UIView的高度约束,以避免出现“不明确的高度”警告。 但在iPhone 4s上运行时,UIView不够高,无法容纳它的子视图。 到目前为

  • 我有一个UIScrollView,嵌套在一个内容视图中,它有两个嵌套的子视图,一个具有已知高度的常规UIView,以及一个具有动态高度的容器视图,具体取决于内容。就像这样: 视图如下所示: 我的约束设置如下: 滚动视图被限制在其超级视图(即视图)的尾缘、前缘、顶端和下边缘 内容视图被约束到其超级视图(即滚动视图)的尾部、前导、顶部和底部边缘。它还具有与主视图(即视图)相等的宽度约束,因此滚动视图的

  • 英文原文:http://emberjs.com/guides/views/customizing-a-views-element 视图在页面上表现为一个单一的DOM元素。通过修改tagName属性,可以改变视图生成的元素的类型。 1 2 3 App.MyView = Ember.View.extend({ tagName: 'span' }); 另外,还可以通过设置一个字符串数组到clas

  • 还有人觉得这有点令人沮丧或有什么建议吗?从基类中膨胀相同的布局似乎并不罕见。

  • 问题内容: 我正在使用基于SDK演示示例中EfficientAdapter示例的BaseAdapter扩展版本。 我的数据基本上是一个对象(),其中包含一个,其中包含实际的地点列表,可通过访问。此ArrayList数据按范围排序,由一些特殊项目(分隔符)组成,没有数据,但标志设置为。 现在,每当我得到一个作为分隔符的数据对象时,它都会返回并根据当前数据对象是由真实数据组成还是仅仅是分隔符虚拟物来使