2019-12-26 14:55:32 Akikang 阅读数 38

 

现象:

在原生app中嵌套web页面时,时常会遇到由于系统不同带来的差异。

此次引入ElementUI,使用其中的dialog组件时,明明默认dialog显示时,body不能滚动:

element UI 文档

安卓和pc下没毛病,但在iOS下lock-scroll无效,dialog背后的body依然可以滚动。

 

 

解决方法:

思路:

      主要是在打开dialog时设置html的

      position:fixed;

      scroll:no;

      overflow:hidden;(以防万一,加上)

 

      dialog关闭时:

      position:relative;

      scroll:yes;

      overflow:scroll;

实践:

1.添加lock和unlock方法(这里是加在了公共方法util.js里,以便各个组件都可以使用,也可以直接写在各个component的method里):

function lock() {

  document.documentElement.style.overflow = "hidden";

  document.documentElement.style.position = "fixed";

  document.body.scroll = "no"; 

}



function unLock() {

  document.documentElement.style.overflow = "scroll";

  document.documentElement.style.position = "relative";

  document.body.scroll = "yes";

}

2.在组件中引入js,watch监听dialog显示的参数,当dialog显示时调用lock方法,dialog隐藏时调用unlock方法:

<el-dialog

        title="test dialog"

        :visible.sync="centerDialogVisible"

      >

        <div class="testBox">

          Test

        </div>

      </el-dialog>



import util from "../util";

 watch: {

    centerDialogVisible(val) {

      if (val === true) {

        util.lock();

      } else {

        util.unLock();

      }

    }

}


  

问题发生原因:

主要是overflow:hidden在iOS下会失效,而查看ElementUI源码可以看到,lockscroll参数做的事,主要就是给body的overflow加hidden值。

lock-scroll参数指向的js方法

js添加的class的样式

最后:

如果有更棒的解决方法,欢迎指教!

 

 

2018-04-14 20:12:35 chuyuangou9007 阅读数 601


简单的Android弹出Dialog效果(圆角)

    最近一段时间工作挺忙的,一直想写一篇博文,总是被各种事情打破计划,终于这次利用这个周末来开始自己第一次的技术文章的写作,提前说明,本人还是个菜鸟,哈哈...由于技术有限,有写的不好的地方还请各位路过的高手多多指教。

    说起自己的程序员生涯也挺不容易的,从大四自学入门以来也吃了好多苦头,但是听过别人说过一句话:“成年人的世界里没有容易二字”,也许每个人都挺不容易的,但是现在这个世界,不学习根本不可能适应社会的,虽然偶尔觉得技术有点枯燥乏味,但是,能混碗饭吃也算是对得起刚开始的职业生涯的,毕竟路还远着呢,只要好好努力未来该有的还是会有的,年轻人嘛...不要浮躁,慢慢来。

    好了,不多说了,以后的博文再慢慢讲自己是如何从一个门外汉自学跨行进入这个行业的,今晚先早点写完这个博文好好休息下,言归正传,嘿嘿偷笑

    首先我们来看一下效果图:

    


        点击按钮弹出白色的提示框,这个到时候可以根据项目业务逻辑修改底下的按钮

    我们来分析下,这个肯定不是Android系统的Dialog,大家都知道,系统自带的都很丑,我不是说崇拜iphone,IOS能有的效果Android也照样能做出来。这个Dialog要实现肯定是自定义的!

    Dialog的布局不多说了吧,大家直接看xml文件...

    

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg_round_white"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:padding="12dp"
        android:layout_marginTop="12dp"
        android:text="提示"
        android:textSize="16sp"
        android:textColor="@color/black"/>


    <TextView
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_gravity="center_horizontal"
        android:lineSpacingExtra="3dp"
        android:layout_marginLeft="40dp"
        android:layout_marginTop="20dp"
        android:layout_marginRight="40dp"
        android:layout_marginBottom="30dp"
        android:text="签到成功,获得200积分"
        android:textSize="12sp"
        android:textColor="@color/font_common_1"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/commom_background"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/cancel"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/bg_dialog_left_white"
            android:layout_weight="1.0"
            android:gravity="center"
            android:text="取消"
            android:textSize="12sp"
            android:textColor="@color/font_common_2"/>
        <!--中间的分割线-->
        <View
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="@color/commom_background"/>

        <TextView
            android:id="@+id/submit"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/bg_dialog_right_white"
            android:gravity="center"
            android:layout_weight="1.0"
            android:text="确定"
            android:textSize="12sp"
            android:textColor="@color/font_blue"/>

    </LinearLayout>


</LinearLayout>

    然后我们来看下封装的这个自定义Dialog的类:


package com.zhaichenyang.home.customdialog;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.zhaichenyang.home.R;

/**
 * Created by zhaichenyang@outlook.com on 2018/2/7 0007.
 */

public class CustomedOneDialog extends Dialog {

  private Button vipButton;
  private ImageView closeButton;
  private onCloseClickListener closeClickListener;
  private onVipClickListener vipClikListener;
    private Context mComtext;

    @Override
    protected void onStart() {

        getWindow().setBackgroundDrawableResource(android.R.color.transparent);
    }

    public CustomedOneDialog(Context context, int themeResId){
        super(context, themeResId);
        this.mComtext = context;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.dialog_first_layout);
        setCancelable(false);
        initView();
        initData();
        initEvent();
    }
    private void initView(){
        
        vipButton = (Button) findViewById(R.id.bt_comeacross_signupvip);

        //关闭
        closeButton = (ImageView)findViewById(R.id.iv_dialog_comeacross_close);
      


    }
    private void initData(){

    }
    private void initEvent(){
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                closeClickListener.onCloseClick();
            }
        });
        vipButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                vipClikListener.onVipClick();
            }
        });

    }
    public interface onCloseClickListener{
        public void onCloseClick();
    }
    public interface onVipClickListener{
        public void onVipClick();
    }
    public void setOnCloseClickListener(onCloseClickListener listener){
        this.closeClickListener = listener;
    }
    public void setOnVipClickListener(onVipClickListener listener){
        this.vipClikListener = listener;
    }

}

       这个类主要是完成了布局的设置,以及Dialog的样式的设定,用的时候可以根据自己的需要修改Themresid这个配置属性。

        接下来也就是最后一步了,我们来看一下如何使用,我们只需要在点击某个按钮触发时通过自定义Dialog类中的构造传入具体的参数即可:

    
new CommonDialog(this, R.style.MyDialogStyle, myStr1 + "", new CommonDialog.OnCloseListener() {
            @Override
            public void onClick(Dialog dialog, boolean confirm) {
                if (confirm) {
                    //Toast.makeText(MyActivity.this,"QQ1181878209", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(MyActivity.this, SecondActivity.class);
                    startActivity(intent);
                    dialog.dismiss();
                } else {
                    //
                    Intent intent = new Intent(MyActivity.this, ThirdActivity.class);
                    startActivityForResult(intent, mRequestCode);
                    Toast.makeText(MyActivity.this, "QQ1181878209", Toast.LENGTH_SHORT).show();
                    dialog.dismiss();
                }
            }
        }).setTitle("Bin·Laden").show();

一定不要忘记调用Dialog的show()方法,不然的话Dialog是不会弹出来的。

    

最后,感谢一直以来理解支持我的人,正是因为他们我才走的更加坚定。

喜欢就点个赞吧微笑微笑微笑





2019-12-19 10:48:31 eq0218 阅读数 692

###开发项目的时候经常会使用的Dialog,所以给大家分享一个类似IOS风格的Dialog。

####源码下载链接:源码下载

实现效果

实现机制
1.先自定义一个弹出框的样式
2.自己实现MyDialog类,在里面加载自定义样式的弹出框;
3.使用时,与使用Dialog一样
具体代码

####MainActivity.java :

public class MainActivity extends AppCompatActivity {
    private MyDialog myDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView btn = (TextView) findViewById(R.id.click);
        myDialog = new MyDialog(this);
        myDialog.setTitle("注意");//设置标题
        myDialog.setMessage("确认删除吗?");//设置内容

        //调起Dialog
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myDialog.dialog.show();//显示
            }
        });

        //确认按键回调,按下确认后在此做处理
        myDialog.setMyDialogOnClick(new MyDialog.MyDialogOnClick() {
            @Override
            public void ok() {
                Toast.makeText(MainActivity.this, "回调成功了", Toast.LENGTH_LONG).show();
                myDialog.dialog.dismiss();//关闭
            }
        });
    }
}

####MyDialog.java :自定义Dialog的实现类MyDialog

public class MyDialog implements View.OnClickListener {
    private Context context;
    public Dialog dialog;
    public TextView title, message, cancle, ok;
    private MyDialogOnClick myDialogOnClick;

    public MyDialog(Context context) {
        this.context = context;
        //下面三步非常重要
        dialog = new Dialog(context, R.style.dialog);//Dialog的Style
        Window window = dialog.getWindow();
        window.setContentView(R.layout.my_dialog);//引用Dialog的布局

        title = (TextView) window.findViewById(R.id.tv_title);
        message = (TextView) window.findViewById(R.id.tv_message);
        cancle = (TextView) window.findViewById(R.id.btn_cancel);
        ok = (TextView) window.findViewById(R.id.btn_ok);

        cancle.setOnClickListener(this);
        ok.setOnClickListener(this);
    }

    public void setTitle(String titleStr) {
        title.setText(titleStr);
    }

    public void setMessage(String messageStr) {
        message.setText(messageStr);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_ok:
               myDialogOnClick.ok();
                break;
            case R.id.btn_cancel:
                dialog.dismiss();
                break;

        }
    }

    //给确认按钮设置回调的接口
    public interface MyDialogOnClick{
         void ok();
    }

    public void setMyDialogOnClick(MyDialogOnClick myDialogOnClick){
        this.myDialogOnClick =myDialogOnClick;
    }

}

####my_dialog.xml 自定义Dialog的布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@null">
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_gravity="center_horizontal"
        android:background="@drawable/top_title"
        android:gravity="center_horizontal"
        android:text="警告"
        android:textColor="#000"
        android:textSize="16sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tv_message"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_below="@id/tv_title"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:background="#fff"
        android:padding="5dp"
        android:maxLines="2"
        android:text="你正在进行危险操作"
        android:textColor="#9000"
        android:textSize="14sp" />

    <View
        android:id="@+id/line1"
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="#ccc"
        android:layout_below="@+id/tv_message"
        />


    <LinearLayout
        android:layout_below="@+id/line1"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@drawable/bottom_title"
        android:orientation="horizontal"
        >
        <TextView
            android:id="@+id/btn_cancel"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:text="取消"
            android:layout_weight="1"
            android:gravity="center"
            android:textColor="#000"
            />
        <View
            android:layout_width="0.5dp"
            android:layout_height="match_parent"
            android:background="#ccc"
            />
        <TextView
            android:id="@+id/btn_ok"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:text="确定"
            android:layout_weight="1"
            android:textColor="#000"
            android:gravity="center"
            />
    </LinearLayout>
</RelativeLayout>

####引用的样式styles.xml

 <style name="dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
    </style>

####为了实现圆角,必须把style里的两个背景都设置为透明,并且在my_dialog.xml dialog的Top和Bottom中把Background分别设置为top_title.xml和bottom_title.xml

####top_title.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#fff"></solid>
    <corners
        android:bottomLeftRadius="0dp"
        android:bottomRightRadius="0dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp"></corners>
</shape>

####bottom_title.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#fff"></solid>
    <corners
        android:bottomLeftRadius="10dp"
        android:bottomRightRadius="10dp"
        android:topLeftRadius="0dp"
        android:topRightRadius="0dp"></corners>
</shape>

到这一步页就完成了。实现原理很简单。希望能给不懂的同学带来启发。
这个项目Android Studio环境下开发的。所以使用Eclipse的同学只能复制到eclipse

2017-10-30 13:58:38 github_38163856 阅读数 240
不得不说IOS系统的对话框确实漂亮 那么 我们就也来上一套

这里写图片描述
这里写图片描述

布局文件很简单   就是照着效果图自己贴  考虑到适配的问题  还需要自己做处理

public class DialogIos extends Dialog {

    private Context context;
    private String titleMessage;
    private String contontMessage;

    public DialogIos(Context context, String titleMessage,String contontMessage) {
        super(context,R.style.dialog_custom);
        this.context = context;
        this.titleMessage = titleMessage;
        this.contontMessage = contontMessage;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window window = getWindow();
        window.setGravity(Gravity.CENTER);
        setContentView(R.layout.dialog_ios_layout);
        setCanceledOnTouchOutside(false);// 点击Dialog外部消失
        initView();
    }

    private void initView() {
        TextView diolog_title = (TextView) findViewById(R.id.diolog_title);
        diolog_title.setText(titleMessage);
        TextView diolog_contont = (TextView) findViewById(R.id.diolog_contont);
        diolog_contont.setText(contontMessage);
        TextView comfirm_choose = (TextView) findViewById(R.id.comfirm_choose);
        comfirm_choose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != onclickItemListen){
                    onclickItemListen.OnitemClick("1");
                }
            }
        });
        TextView cancle_choose = (TextView) findViewById(R.id.cancle_choose);
        cancle_choose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (null != onclickItemListen){
                    onclickItemListen.OnitemClick("0");
                }
            }
        });
    }

    public interface OnclickItemListen{
        void OnitemClick(String contont);
    }
    public OnclickItemListen onclickItemListen;
    public void SetOnCLickListen(OnclickItemListen onclickItemListen){
        this.onclickItemListen = onclickItemListen;
    }
}



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@drawable/button_write_back"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="70dp"
            android:gravity="center"
            android:orientation="vertical">

            <TextView
                android:id="@+id/diolog_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:gravity="center"
                android:text="提示"
                android:textColor="@color/black"
                android:textSize="16dp" />

            <TextView
                android:id="@+id/diolog_contont"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="是否删除该地址"
                android:textColor="@color/black"
                android:textSize="14dp" />
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="@color/line_eee" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="40dp">

            <TextView
                android:id="@+id/cancle_choose"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="取消"
                android:textColor="#00f"
                android:textSize="15dp" />

            <View
                android:layout_width="1px"
                android:layout_height="match_parent"
                android:background="@color/line_eee" />

            <TextView
                android:id="@+id/comfirm_choose"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="center"
                android:text="确定"
                android:textColor="@color/red_color"
                android:textSize="15dp" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>



    <!-- dialog样式 -->
    <style name="dialog_custom" parent="@android:style/Theme.Dialog">
        <item name="android:windowIsFloating">true</item>    <!--是否浮在界面上-->
        <item name="android:windowIsTranslucent">true</item> <!--是否半透明-->
        <item name="android:windowNoTitle">true</item>       <!--是否有标题-->
        <item name="android:windowBackground">@android:color/transparent</item> <!--窗口背景色透明-->
        <item name="android:backgroundDimEnabled">true</item> <!--背景是否模糊显示-->
    </style>

具体用法

 DialogIos dialogIos = new DialogIos(AddHbuyDynamicsActivity.this,"信息未完善","完善用户名、手机号、邮箱、头像、地区\n生日等才可以发帖哦~");
                                        dialogIos.SetOnCLickListen(new DialogIos.OnclickItemListen() {
                                            @Override
                                            public void OnitemClick(String contont) {
                                                if ("1".equals(contont)){
                                                    startActivity(new Intent(AddHbuyDynamicsActivity.this, HbuyUserDetailActivity.class));
                                                    dialogIos.cancel();
                                                }else {
                                                    dialogIos.cancel();
                                                }
                                            }
                                        });
                                        dialogIos.show();

写的很仓促 稍后会将他做一个完善 网上也有一个仿IOS的 SuperDialog 大家可以去看一下

2018-03-21 18:18:32 shao941122 阅读数 261

    由于android各个版本的系统Dialog样式都不一样,并且也不是特别好看,所以这里自己定制一套高仿iOS样式的android Dialog。让自己的代码具备两个平台的风格,并可以自由切换。

show_01

show_02

show_03

 快速使用:

Step 1. Add it in your root build.gradle at the end of repositories:

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

Step 2. Add the dependency

dependencies {
	compile 'com.github.shaoshuai904:iOS_Style_Dialog:1.2.2'
}

AlertDialog

样式布局:[ 标题 + 消息 + 左按钮 + 右按钮]
        new AlertEditDialog(mContext)
                .setTitle("姓名")
                .setMessage("请输入您的真实姓名。")
                .setLeftButton("取消", null)
                .setRightButton("确定", new AlertEditDialog.EditTextCallListener() {
                    @Override
                    public void callBack(String str) {
                        showToast(str);
                    }
                })
                .show();

AlertEditDialog

样式布局:[ 标题 + 消息 + 输入框 + 左按钮 + 右按钮 ]
        new AlertEditDialog(mContext)
                .setTitle("姓名")
                .setMessage("请输入您的真实姓名。")
                .setLeftButton("取消", null)
                .setRightButton("确定", new AlertEditDialog.EditTextCallListener() {
                    @Override
                    public void callBack(String str) {
                        showToast(str);
                    }
                })
                .show();

ActionSheetDialog

样式布局:[ 标题 + 页签条目 + 取消按钮 ]
        new ActionSheetDialog(mContext)
                .setTitle("请选择操作")
                .setCancelable(false)
                .setCanceledOnTouchOutside(false)
                .addSheetItem("条目一", Color.parseColor(DEF_RED), new ActionSheetDialog.OnSheetItemClickListener() {
                    @Override
                    public void onClick(int which) {
                        showToast("item " + which);
                    }
                })
                .addSheetItem("条目二", new ActionSheetDialog.OnSheetItemClickListener() {
                    @Override
                    public void onClick(int which) {
                        showToast("item " + which);
                    }
                })
                .addSheetItem("条目三", Color.BLUE, new ActionSheetDialog.OnSheetItemClickListener() {
                    @Override
                    public void onClick(int which) {
                        showToast("item " + which);
                    }
                })
                // ……
                .addSheetItem("条目十", new ActionSheetDialog.OnSheetItemClickListener() {
                    @Override
                    public void onClick(int which) {
                        showToast("item " + which);
                    }
                }).show();

AlertNumberPickerDialog

样式布局:[ 标题 + 选择框 + 左按钮 + 右按钮 ]
        numbers = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};
        defValue = numbers[index];

        new AlertNumberPickerDialog(mContext)
                .setTitle("Number")
                .setNumberValues(numbers, index, new NumberPicker.OnValueChangeListener() {
                    @Override
                    public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
                        defValue = numbers[newVal];
                    }
                })
                .setLeftButton("Cancel", null)
                .setRightButton("OK", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        showToast(defValue);
                    }
                })
                .show();

 

    附录GitHub项目地址:https://github.com/shaoshuai904/iOS_Style_Dialog

 

没有更多推荐了,返回首页