代码之家  ›  专栏  ›  技术社区  ›  Riddhi

方向更改时带有listview的自定义对话框(横向模式)

  •  0
  • Riddhi  · 技术社区  · 6 年前

    我希望我的自定义对话框在纵向和横向模式下工作。为此,我找到了在layout land文件夹中创建XML的解决方案。因此,我复制了布局并将其粘贴到layout land文件夹中,并进行了修改(添加了一个滚动视图)。不过,它并没有像我预期的那样起作用。尽管添加了scrollview,但对话框并没有完全滚动。

    我的地盘/对话框.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>
    

    see here 与。 在横向模式下对话框的外观 see here

    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();
    }
    

    问题是,布局不合适。我提到了land文件夹中的xml布局我也是。还有同时将视图放在scrollview中,但scrollview仍然不会将对话框滚动到底部。

    listview ? 如果是的话,请给我一些解决方案。如果不是,原因是什么?如何克服这种情况?任何帮助都将不胜感激。

    请帮我解决这个问题。

    3 回复  |  直到 6 年前
        1
  •  1
  •   Community CDub    5 年前

    这是因为 更改屏幕方向后不会重新创建对话框 . 资源布局陈旧。

    为了解决这个问题,你可以 检测方向变化 重新创建对话框 如果已经打开。 你可以用 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\u parent。

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

    this answer

    更新

    使用 嵌套滚动视图

    我创建了一个示例,在这两种模式下都可以正常工作,您会惊讶地发现我没有为dialog设置任何特殊属性。这是样品。

    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);
            }
        }
    }
    

    和对话_示例.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

    请注意。

    • 我没有处理方向,它的工作如预期。
    • 我重视孩子的观点。所以它在两个方向上都会自动适应。
        2
  •  0
  •   Jeel Vankhede    6 年前

    在你的 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 在里面 无任何剪辑的横向模式 .

    边距 对话 ,

    //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

        3
  •  0
  •   Viral Patel    6 年前

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

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

    推荐文章