Подтвердить что ты не робот

Как бы вы создали всплывающее представление в Android, например Facebook Comments?

Мне было интересно, знает ли кто-нибудь, как создать Facebook-подобный вид, похожий на Facebook, для комментариев.

Вот что я имею в виду:

enter image description here

Наряду с дескриптором, который вы можете перетащить, чтобы отменить его, является ли он собственным пользовательским интерфейсом для пользовательского интерфейса Android или же он реализовал это самостоятельно?

4b9b3361

Ответ 1

Лучший способ создать подобный popover view можно с помощью PopupWindow, так как вы можете поместить PopupWindow на любой из (или в центре/сверху/снизу экрана). Вы также можете достичь того же интерфейса с DialogFragment, но вы не можете позиционировать его в определенном месте просмотра.

У меня есть полный рабочий код здесь https://gist.github.com/libinbensin/67fcc43a7344758390c3

Шаг 1. Создайте свой собственный макет, например, как Facebook, он имеет Header TextView с ListView и EditText.

Шаг 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);

Теперь установите фон PopupWindow с возможностью рисования. Выбираемый имеет 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

Ответ 2

Edit:

Собственно, хотя я использовал 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

Просто добавьте свой контент для просмотра, и вы хорошо пойдете!

Ответ 4

Это похоже на пользовательский компонент, созданный Facebook. Это не стандартный компонент Android. Вы можете попробовать выполнить его, извлекая из фрагмента диалога.

Ответ 5

Похоже, что проще всего использовать фрагмент с прозрачным (или в этом случае полупрозрачным) фоном.