【问题标题】:How to put a view in center of activity programatically?如何以编程方式将视图置于活动中心?
【发布时间】:2020-05-20 19:20:17
【问题描述】:

我想以编程方式在活动上添加自定义视图并将其放置在活动的底部中心。

到目前为止,我能够创建一个视图,设置其 X 和 Y 坐标并将其添加到根视图,但我无法居中对齐视图。

有什么办法可以做到吗?

我不想使用 XML 来实现这一点,因为我想动态添加视图。

我曾尝试在 StackOverflow 上搜索此内容,但无法正常工作。

这就是我添加视图的方式。

        val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        mView = inflater.inflate(R.layout.view_popup_toast, null)
        mView?.findViewById<TextView>(R.id.popup_text)?.text = "Text"
        mView?.x = 500F
        val params = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)

        //This is not working
        //params.gravity = Gravity.CENTER_VERTICAL or Gravity.BOTTOM

        (window.decorView.rootView as ViewGroup).addView(mView, params)

【问题讨论】:

  • 您是否尝试实现类似的吐司行为?如果是这样,如果你的 Activity 有其他视图,你是如何在它上面显示 toast 的?
  • 将 XML 布局的视图包装在 FrameLayout 中,这样您的 rootView 将成为 FrameLayout。然后在以编程方式创建此视图时,给它FrameLayout.LayoutParams,以便您可以分配重力。
  • @y.allam 是的,我想要类似于 Toast 的东西。但是吐司是直接在窗口上绘制的,它使它变得不难处理。我希望这个自定义视图也能处理滑动手势。
  • @Tenfour04 你的意思是用 FrameLayout 包装我的自定义视图的 XML 还是用 FrameLayout 包装 Activity 的 XML?
  • Activity 的,因此您的视图可以覆盖其他所有内容。

标签: android android-layout kotlin android-activity android-view


【解决方案1】:

尝试将活动的根视图设为RelativeLayout,然后在添加view_popup_toast 时使用RelativeLayout.LayoutParams

val params = RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)
params.addRule(RelativeLayout.CENTER_HORIZONTAL)
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM)

(window.decorView.rootView as ViewGroup).addView(mView, params)

【讨论】:

  • 这种方法可行,但它不是可重用的方法。我在这里想要实现的是制作一个可重用的组件,它可以添加到任何活动中。因此,在应用程序的任何地方都无法创建活动根。
  • 是的,你是对的,所以也许这里的基础活动可以解决这个问题
猜你喜欢
  • 2020-03-27
  • 2018-09-19
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多