【问题标题】:Android how to align table to cell positionAndroid如何将表格与单元格位置对齐
【发布时间】:2018-03-03 03:42:16
【问题描述】:

我有第一个 TableLayout,其中包含由代码动态生成的行和单元格。
现在,我有第二个由 3 行组成的更小的 TableLayout。
通过单击第一个表中的任何单元格来显示第二个表。
现在我的问题是:
如何在单击的单元格位置对齐第二个表格,并与第一个表格重叠?

感谢您的建议。


编辑:不幸的是,我无法向公众展示布局。但我画了它应该是怎样的。很抱歉给您带来不便。

first table. click on cell

show the second table at the senter of cell clicked

【问题讨论】:

  • 是否可以分享更易于查看和概念化的图像。
  • 您会考虑改用对话框吗?我相信通过对话您可以实现这一目标
  • @Soumya 我已经编辑了帖子。谢谢你的建议!
  • @Mercato idk!单击时对话框可以有按钮和逻辑吗?抱歉,我是 Android World 的新手!

标签: android alignment positioning tablelayout overlap


【解决方案1】:

您可以选择使用自定义对话框片段来执行此操作。

首先,获取您单击的第一个表格视图的单元格的全局 x 和 y 位置。来自this post:

Rect myViewRect = new Rect();
myView.getGlobalVisibleRect(myViewRect);
float cx = myViewRect.exactCenterX();
float cy = myViewRect.exactCenterY();

然后,创建一个扩展 DialogFragment 的类(我们称之为SecondTableFragment)。要从默认的 Android 样式对话框更改 Dialog,您需要做一些事情

让标题消失

@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    return dialog;
}

设置对话框的宽度以适合您的第二个表格视图

    @Override
    public void onResume() {
    getDialog().getWindow().setLayout([PARENT_LAYOUT_TYPE].LayoutParams.WRAP_CONTENT, [PARENT_LAYOUT_TYPE].LayoutParams.WRAP_CONTENT);
    super.onResume();
}

Set the position of your dialog window 高于您单击的单元格(这很可能也应该在 onCreateDialog() 中完成):

 WindowManager.LayoutParams wmlp =  dialog.getWindow().getAttributes();

 wmlp.gravity = Gravity.TOP | Gravity.LEFT;
 wmlp.cx = cx;   //x position
 wmlp.cy = cy;   //y position

对于填充 Dialog 视图本身的逻辑,您需要为第二个表格布局创建一个新的布局文件(就像您为一个新的 Activity 所做的那样)并像任何其他正常的一样填充它并用相关信息填充它分段。确保在调用 newInstance() 方法时传入您希望对话框所在的 x 和 y 坐标。见Google's Documentation

一切都设置好后,您可以使用 Fragment Manager(或 ChildFragmentManager,如果您已经在 Fragment 中)在第一个 TableLayout 上方显示一个带有相关信息的“第二个表格对话框”

SecondTableFragment fragment = SecondTableFragment.newInstance(cx, cy, RELEVANT INFORMATION ...);
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment prev = getSupportFragmentManager().findFragmentByTag("secondTable");
    if (prev != null) {
        ft.remove(prev);
    }
    ft.add(fragment, "secondTable");
    ft.addToBackStack(null);
    ft.commitAllowingStateLoss();
    fragment.setCancelable(false);

【讨论】:

  • 首先感谢您的回复。第二种方式,我不理解“findFragmentByTag("secondTable");”方法。什么是“第二表”?我必须像xml中的片段一样定义表格吗?
    再次,对不起我的新手问题!
  • 没问题;如您所见,我通过调用 ft.add(fragment, "secondTable") 将片段添加到片段堆栈。这意味着我给它一个字符串“secondTable”的“标签”。该行 "findFragmentByTag("secondTable") 检查具有该确切标签的片段是否已经存在,如果存在,则首先将其删除,以便您可以显示一个新片段。
  • 没问题 A.Scudino,如果对您有帮助,请选择此作为正确答案(打勾)!编码愉快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多