Android如何将表格与单元格位置对齐

时间:2017-09-21 17:25:07

标签: android alignment positioning tablelayout overlap

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

感谢您的建议。

编辑:不幸的是,我无法向公众展示布局。但我画了它应该如何。抱歉,我感到抱歉
first table. click on cell

show the second table at the senter of cell clicked

1 个答案:

答案 0 :(得分:0)

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

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

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

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

让标题消失

@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做的那样)并对其进行充气并用相关的其他信息填充它分段。确保通过x& y在调用它的newInstance()方法时,您希望对话框处于协调状态。见Google's Documentation

一旦设置好所有内容,您就可以使用片段管理器(或者如果您已经在片段中的ChildFragmentManager)显示第一个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);