你会如何在Android中创建一个popover视图,比如Facebook评论?

时间:2014-05-05 03:14:20

标签: android android-layout android-fragments

我想知道是否有人知道如何在Facebook Android应用程序中创建类似Facebook的弹出视图以供评论。

这就是我的意思:

enter image description here

除了你可以拖动以解除它的句柄,它是一个原生的Android UI控件还是Facebook自己实现了这个?

5 个答案:

答案 0 :(得分:49)

创建类似popover view的最佳方法是使用PopupWindow,因为您可以将PopUpWindow放置在任何特定的视图位置(或屏幕的中心/顶部/底部) )。您也可以使用DialogFragment获得相同的用户界面,但无法定位到特定的视图位置。

我在这里有完整的工作代码https://gist.github.com/libinbensin/67fcc43a7344758390c3

第1步:创建自定义布局,例如,Facebook有Header TextView ListViewEditText

第2步:将布局设置为PopupWindow

使布局膨胀以设置

LayoutInflater layoutInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View inflatedView = layoutInflater.inflate(R.layout.fb_popup_layout, null,false);

Layout有一个ListView,因此请在布局中找到ListView并填充数据。你可以在这里拥有自己的观点

ListView listView = (ListView)inflatedView.findViewById(R.id.commentsListView);
listView.setAdapter(new ArrayAdapter<String>(TryMeActivity.this,
        R.layout.fb_comments_list_item, android.R.id.text1,contactsList));

现在,创建一个具有特定高度和宽度的PopupWindow实例。我更喜欢设置大小取决于设备。

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);

popWindow = new PopupWindow(inflatedView, size.x - 50,size.y - 500, true );

设置弹出窗口的focusability

popWindow.setFocusable(true);

将其设置为可触摸的to dismiss the popup window when touched outside弹出区域

popWindow.setOutsideTouchable(true);

现在,使用drawable设置PopupWindow的背景。 drawable有rectangle shape corner radius

  popWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.fb_popup_bg));

最后。在所需位置显示PopupWindow。我在屏幕的bottom显示了一些X and Y position

popWindow.showAtLocation(v, Gravity.BOTTOM, 0,150);  // 0 - X postion and 150 - Y position

您还可以设置Animation,以便PopUpWindow出现并消失

popWindow.setAnimationStyle(R.anim.animation); // call this before showing the popup

enter image description here

答案 1 :(得分:8)

修改

实际上,即使我使用了DialogFragment,我也很确定它们的弹出窗口不会使用DialogFragment(甚至根本就不是Dialog)!原因是调整大小功能。如果这是您想要的,那么您不能使用DialogFragment。您只需要在布局中添加新视图。它看起来像facebook还有另一个视图,它位于你的墙和虚拟弹出窗口之间,略微半透明,并且听取点击以消除视图。像这样的东西需要一些实际的努力和时间来构建,所以我不会为你做这个。如果您对此有任何疑问,请告诉我,我可以引导您找到您想要的解决方案。

<强>原始

我为你写了一个弹出窗口:

public class MyActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            F1.newInstance().show(getFragmentManager(), null);
        }
    }

    public static class F1 extends DialogFragment {

        public static F1 newInstance() {
            F1 f1 = new F1();
            f1.setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_DeviceDefault_Dialog);
            return f1;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            // Remove the default background
            getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

            // Inflate the new view with margins and background
            View v = inflater.inflate(R.layout.popup_layout, container, false);

            // Set up a click listener to dismiss the popup if they click outside
            // of the background view
            v.findViewById(R.id.popup_root).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dismiss();
                }
            });

            return v;
        }
    }
}

popup_layout.xml:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:id="@+id/popup_root">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="72dp"
        android:layout_marginBottom="72dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:padding="20dp"
        android:clickable="true"
        android:background="@drawable/dialog_background">

        <TextView
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:textColor="#000"
            android:text="Content goes here!" />

    </FrameLayout>

</FrameLayout>

和dialog_background.xml(进入res / drawable):

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <solid android:color="#FFF" />
    <corners android:topLeftRadius="20dp" android:topRightRadius="20dp"
         android:bottomLeftRadius="20dp" android:bottomRightRadius="20dp"/>
    <stroke android:color="#7F7F7F" android:width="1dp" />
</shape>

它看起来像这样:

enter image description here

只需添加您的观看内容,就可以了!

答案 2 :(得分:1)

您可以使用PopupWindow来执行此操作。 http://developer.android.com/reference/android/widget/PopupWindow.html

当然,您需要设置样式并自行填写弹出窗口的内容。您可以从How to make layout with rounded corners..?

获得一些样式创意

答案 3 :(得分:0)

这似乎是Facebook构建的自定义组件。它不是标准的Android组件。您可以尝试通过派生Dialog Fragment来实现它。

答案 4 :(得分:-1)

看起来使用具有透明(或在这种情况下为半透明)背景的片段是最容易的。