Пользовательский диалог со списком при смене ориентации (альбомный режим) - PullRequest
0 голосов
/ 30 августа 2018

Я хотел, чтобы мой пользовательский диалог работал как в портретном, так и в ландшафтном режиме. для этого я нашел решение для создания XML в папке layout-land. Итак, я скопировал макет и вставил его в папку layout-land и внес изменения (добавил вид прокрутки). Тем не менее, это не работает, как я ожидал. несмотря на добавление scrollview, диалог не прокручивается полностью.

Диалог также содержит представление списка.

мой файл layout-land / dialog.xml выглядит следующим образом.

<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/transparent"
    tools:context="customviews.VeriDocDialog">

    <android.support.constraint.ConstraintLayout
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:background="@color/transparent"
        app:layout_constraintBottom_toBottomOf="@id/center_fab_view"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

    </android.support.constraint.ConstraintLayout>

    <android.support.constraint.ConstraintLayout
        android:id="@+id/top_fab_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:elevation="1dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <ImageView
            android:id="@+id/top_fab"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:background="@drawable/round_bg"
            android:scaleType="center"
            android:src="@drawable/share_24" />

    </android.support.constraint.ConstraintLayout>

    <View
        android:id="@+id/center_fab_view"
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        app:layout_constraintCircle="@id/top_fab_layout" />

    <android.support.constraint.ConstraintLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@color/white"
        app:layout_constraintBottom_toBottomOf="@id/top_fab_layout"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="@id/center_fab_view">

    </android.support.constraint.ConstraintLayout>

    <ImageView
        android:id="@+id/img_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:elevation="5dp"
        android:src="@drawable/cross_30"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/center_fab_view" />

    <ScrollView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/top_fab_layout">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            >

            <TextView
                android:id="@+id/dialog_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:layout_margin="10dp"
                android:textColor="@color/primary_text"
                android:textSize="@dimen/textsize_xlarge"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                tools:text="TITLE" />

            <ImageView
                android:id="@+id/img"
                android:layout_width="45dp"
                android:layout_height="wrap_content"
                android:layout_below="@id/dialog_title"
                android:layout_centerHorizontal="true"
                android:src="@drawable/hr"
                app:layout_constraintBottom_toTopOf="@id/tv_instruction"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@id/dialog_title" />

            <TextView
                android:id="@+id/tv_instruction"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/img"
                android:layout_centerHorizontal="true"
                android:layout_margin="5dp"
                android:gravity="center"
                android:lines="2"
                android:text="invited friends \n to win more scrathches"
                android:textColor="@color/primary_text"
                android:textSize="@dimen/textsize_medium"
                app:layout_constraintBottom_toTopOf="@id/center_text"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@id/img" />

            <RelativeLayout
                android:id="@+id/center_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/tv_instruction"
                android:layout_centerHorizontal="true"
                android:layout_margin="5dp"
                app:layout_constraintBottom_toTopOf="@id/listview"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@id/tv_instruction">

                <TextView
                    android:id="@+id/tv_equation"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true"
                    android:gravity="center"
                    android:lines="2"
                    android:text="invite 1 = 2 Scratches"
                    android:textColor="@color/primary_text"
                    android:textSize="@dimen/textsize_medium" />

                <TextView
                    android:id="@+id/tv_highlighted_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true"
                    android:gravity="center"
                    android:padding="5dp"
                    android:text="Facebook"
                    android:textColor="@color/blue_A200"
                    android:textSize="@dimen/textsize_regular"
                    android:visibility="gone" />

            </RelativeLayout>

            <View
                android:id="@+id/view_above_listView"
                android:layout_width="wrap_content"
                android:layout_height="3dp"
                android:layout_above="@+id/listview"
                android:background="@drawable/primary_gradient_horizontal"
                app:layout_constraintBottom_toTopOf="@id/listview" />

            <ListView
                android:id="@+id/listview"
                android:layout_width="match_parent"
                android:layout_height="160dp"
                android:layout_below="@id/center_text"
                android:divider="@color/selected_gray"
                android:dividerHeight="1dp"
                app:layout_constraintBottom_toTopOf="@id/view_above_button"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@id/center_text" />

            <TextView
                android:id="@+id/tv_loading"
                android:layout_width="match_parent"
                android:layout_height="160dp"
                android:layout_below="@id/center_text"
                android:gravity="center"
                android:text=""
                android:textColor="@color/primary"
                android:textSize="16sp"
                android:visibility="gone"
                app:layout_constraintBottom_toTopOf="@id/view_above_button"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@id/center_text" />

            <View
                android:id="@+id/view_above_button"
                android:layout_width="wrap_content"
                android:layout_height="3dp"
                android:layout_above="@+id/btn_bottom"
                android:background="@drawable/primary_gradient_horizontal"
                app:layout_constraintBottom_toTopOf="@id/btn_bottom" />

            <Button
                android:id="@+id/btn_bottom"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/listview"
                android:background="@color/selected_gray"
                android:text="invite"
                android:textColor="@color/primary_text"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toBottomOf="@id/listview" />

        </RelativeLayout>

    </ScrollView>

</android.support.constraint.ConstraintLayout>

Как выглядит диалог в портретном режиме см. Здесь Vs. Как выглядит диалог в ландшафтном режиме см. Здесь

мой код VeriDocDialog.java выглядит следующим образом

public class VeriDocDialog extends Dialog {
     private View dialogView;

    public VeriDocDialog(@NonNull Context context, String dialogType, int iconDrawableId, String instructions,String bottomText, List<Contact> contactList, String buttonText) {

        super(context);
        this.context = context;
        this.dialogType = dialogType;
        this.iconDrawableId = iconDrawableId;
        this.instruction = instructions;
        this.buttonText = buttonText;
        this.contactList = contactList;
        this.bottomText = bottomText;

        setupVeriDocDialog();
    }

    public VeriDocDialog(@NonNull Context context, String dialogType, int iconDrawableId, String instructions, String bottomText, List<ResolveInfo> shareList, String buttonText, Intent shareIntent) {

        super(context);
        this.context = context;
        this.dialogType = dialogType;
        this.iconDrawableId = iconDrawableId;
        this.instruction = instructions;
        this.buttonText = buttonText;
        this.shareList = shareList;
        this.bottomText = bottomText;
        this.shareIntent = shareIntent;

        setupVeriDocDialog();
    }

    private void setupVeriDocDialog() {

        if (getWindow() != null) {
            getWindow().setBackgroundDrawableResource (R.color.transparent);
            getWindow().setGravity(Gravity.CENTER);
            getWindow().getAttributes().windowAnimations = R.style.dialogAnimation;
            requestWindowFeature(Window.FEATURE_NO_TITLE);
        }
    }

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

         dialogView = getLayoutInflater().inflate(R.layout.dialog_veri_doc, null);
         setContentView(dialogView);

         bindView();
         initialise(dialogType);
     }

     //.... and other methods .....
}    

Как я вызываю этот диалог из моей деятельности:

private void displayInviteDialog() {
    contactList = new ArrayList<>();

    inviteDialog = new VeriDocDialog(ScratchAndWinActivity.this,
            VeriDocDialog.TYPE_INVITE,
            R.drawable.invite_32,
            getString(R.string.str_invite_instruction),
            getString(R.string.str_equation_invite),
            contactList, VeriDocDialog.TYPE_INVITE);


    inviteDialog.show();
}

Проблема в том, что верстка неправильная. Я также упомянул макет xml в папке land. И также поместил представления в представление scrollview, но, тем не менее, представление scrollview не прокручивает диалоговое окно до его основания.

это из-за listview? если да, то, пожалуйста, дайте мне какое-нибудь решение. и если нет то в чем может быть причина и как преодолеть эту ситуацию? любая помощь будет оценена.

и когда я пытаюсь открыть диалоговое окно, когда ориентация является альбомной, xml из папки Land завышается. но когда я открываю диалоговое окно в портретной ориентации и после этого меняю ориентацию, xml остается тем же (то же самое в обычном макете, но не из папки land).

Пожалуйста, помогите мне с этой проблемой.

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

В моем макете \ activity_main.xml используется

<ScrollView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/scrollView"
        android:visibility="visible">
....
</ScrollView>

На земле \ activity_main.xml

<HorizontalScrollView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/scrollView"
        android:visibility="visible">
....
</HorizontalScrollView>

Надеюсь, это тебе поможет ..!

0 голосов
/ 07 сентября 2018

Это потому, что ваш диалог не воссоздается после изменения ориентации экрана . И у этого есть старая структура ресурса.

Для решения вы можете обнаружить изменение ориентации и восстановить диалог , если он уже открыт. Вы можете использовать onConfigurationChanged в своей Активности для обнаружения изменения ориентации.

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }

    if (inviteDialog !=null && inviteDialog.isShowing()){
        inviteDialog .dismiss(); 
        displayInviteDialog();
    }
}

private void displayInviteDialog() {
    contactList = new ArrayList<>();

    inviteDialog = new VeriDocDialog(ScratchAndWinActivity.this,
            VeriDocDialog.TYPE_INVITE,
            R.drawable.invite_32,
            getString(R.string.str_invite_instruction),
            getString(R.string.str_equation_invite),
            contactList, VeriDocDialog.TYPE_INVITE);


    inviteDialog.show();
}

И немного отредактируйте регистрацию активности манифеста.

<activity android:name=".YourActivity"
      android:configChanges="orientation">

Предложение:

1> Вы должны использовать match_parent для родительского элемента макета Dialog.

android:layout_width="match_parent"
android:layout_height="match_parent"

2> Установить программную высоту и ширину диалога match_parent также. См этот ответ

Обновление

Используйте NestedScrollView вместо ScrollView , поскольку сам ListView имеет свойство прокрутки, которое может вызвать конфликты.

Обновление

Я создал образец, который отлично работает в обоих режимах, вы будете удивлены, узнав, что я не установил никакого специального свойства для диалога, чтобы это работало. Вот образец.

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.innovanathinklabs.sample.R;

/**
 * Created by KHEMRAJ on 8/29/2018.
 */
public class ListActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyDialog dialog = new MyDialog(this);
        dialog.show();
        Window window = dialog.getWindow();
        window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
    }

    public static class MyDialog extends Dialog {
        String[] mobileArray = {
                "Android", "IPhone", "WindowsMobile", "Blackberry",
                "WebOS", "Ubuntu", "Windows7", "Max OS X", "Android", "IPhone", "WindowsMobile", "Blackberry",
                "WebOS", "Ubuntu", "Windows7", "Max OS X", "Android", "IPhone", "WindowsMobile", "Blackberry",
                "WebOS", "Ubuntu", "Windows7", "Max OS X",
        };

        public MyDialog(@NonNull Context context) {
            super(context);
        }

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.dialog_sample);
            ArrayAdapter adapter = new ArrayAdapter<>(getContext(),
                    R.layout.row_list, mobileArray);
            ListView listView = findViewById(R.id.listView);
            listView.setAdapter(adapter);
        }
    }
}

и dialog_sample.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical">

    <!--in this view, horizontal and vertical both dialog has scrollable List and other view looks static-->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="5">

        <!--place your all top content here-->
    </LinearLayout>

    <!--weight 1 is giving List view the available space. -->

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="5"/>

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/app_name"/>

</LinearLayout>

Вот вывод

enter image description here

enter image description here

Обратите внимание, что.

  • Я не справился с ориентацией, он работает как положено.
  • Я установил вес для детей. Таким образом, он автоматически вписывается в обе ориентации.
  • Проблема в макете xml заключалась в том, что вы не использовали вес / процент, поэтому контент выходит за пределы экрана.
0 голосов
/ 04 сентября 2018

В вашем VeriDocDialog классе перейдите к методу

private void setupVeriDocDialog() {
    if (getWindow() != null) {
        getWindow().setBackgroundDrawableResource (R.color.transparent);
        getWindow().setGravity(Gravity.CENTER);
        getWindow().getAttributes().windowAnimations = R.style.dialogAnimation;
        getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT); // Add this line and change your height & width acc.
        //Moreover you can add margin to dialog from all directions.
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}

Это поможет вам отобразить dialog в альбомном режиме без каких-либо отсечек .

Для изменения полей на dialog,

//Add this before showing dialog.
WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
layoutParams.x = 10;// offset margin x in pixels, change value to whatever you want
layoutParams.y = 10;// offset margin y in pixels, change value to whatever you want
getWindow().setAttributes(layoutParams);

для справки WindowManager.LayoutParams

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...