android 自定义dialog 易扩展

最近心情不太好,原因是被一女女抛弃了,作为一名程序屌丝,我深感无助,从来没有任何的要求

啰嗦了几句,众屌原谅。

先上效果图:

大概就是这个屌样,

重写了Dialog,主要就是头尾部,可自定义,容易扩展,可设置动画。

上代码(声明:代码没有经过最优化处理,众屌可以自己做处理)

layout文件,(心情不好,懒得整合)

文件名:dialog_c.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/WHITE"
    android:orientation="vertical"
    tools:context=".MainActivity" >
    
    <TextView
        android:id="@+id/dialog_title_textView1"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:background="@color/DIALOG_HEADER_BG_COLOR"
        android:gravity="center"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/BLACK" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="@color/DIALOG_DIVIDER_COLOR" />

    <LinearLayout
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:orientation="vertical" >

    </LinearLayout>
        
    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="@color/DIALOG_DIVIDER_COLOR" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_weight="1"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/dialog_button_confirm"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/dialog_button_selector"
            android:text="@string/dialog_confirm"
            android:textColor="@color/BLACK" />

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="1px"
            android:layout_height="match_parent"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="5dp"
            android:background="@color/DIALOG_DIVIDER_COLOR" />

        <Button
            android:id="@+id/dialog_button_cancel"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="@drawable/dialog_button_selector"
            android:text="@string/dialog_cancel" />
    </LinearLayout>

</LinearLayout>

Java文件:CDialog.java(我都忘了为毛会起这么挫的名字)

包名什么的自己改就行了。

ScreenConfig 类是屏幕宽高,

package com.chishacai.widgets;

import android.app.Activity;
import android.app.Dialog;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.chishacai.personalcenter.R;
import com.chishacai.personalcenter.config.ScreenConfig;

public class CDialog extends Dialog {
    private Activity act;
    private Window window;
    
    private LinearLayout main;
    
    private TextView title;
    private Button confirm;
    private Button cancel;
    
    private CInterface cInterface;
    
    private CDialog instance;
    
    public CDialog(Activity act) {
        super(act, R.style.GeneralDialog);
        
        this.act = act;
        
        setContentView(R.layout.dialog_c);
        
        window = getWindow(); // 得到对话框
        settingDialog(window);
        
        initWidgets();
        
        instance = this;
    }
    
    private void initWidgets() {
        title = (TextView) window.findViewById(R.id.dialog_title_textView1);
        confirm = (Button) window.findViewById(R.id.dialog_button_confirm);
        confirm.setTag(0);
        confirm.setOnClickListener(click);
        cancel = (Button) window.findViewById(R.id.dialog_button_cancel);
        cancel.setTag(1);
        cancel.setOnClickListener(click);
        
        main = (LinearLayout) window.findViewById(R.id.main);
    }
    
    private View.OnClickListener click = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int tag = Integer.valueOf(v.getTag().toString());
            switch (tag) {
            case 0:
                if (cInterface != null) {
                    cInterface.confirm();
                }
                instance.dismiss();
                break;
            case 1:
                if (cInterface != null) {
                    cInterface.cancel();
                }
                instance.dismiss();
                break;
            }
        }
    };
    
    /**
     * set title
     * 
     * @author ddJuly
     * @date 2013-11-1 下午3:19:35
     * @param text
     */
    public void setTitle(String text) {
        title.setText(text);
    }
    
    /**
     * set title
     * 
     * @author ddJuly
     * @date 2013-11-1 下午3:19:44
     * @param text
     */
    public void setTitle(int text) {
        title.setText(text);
    }
    
    /**
     * set content view
     * 
     * @author ddJuly
     * @date 2013-11-1 下午3:19:49
     * @param view
     */
    public void setView(View view) {
        main.addView(view);
    }

    /**
     * set interface
     * 
     * @author ddJuly
     * @date 2013-11-1 下午3:19:57
     * @param cInterface
     */
    public void setCInterface(CInterface cInterface) {
        this.cInterface = cInterface;
    }
    
    
    public interface CInterface {
        void confirm();
        void cancel();
    }
    
    
    public static void settingDialog(Window window) {
        WindowManager.LayoutParams wl = window.getAttributes();
        // 根据x,y坐标设置窗口需要显示的位置
        wl.x = 0; // x小于0左移,大于0右移
        wl.y = 0; // y小于0上移,大于0下移
        wl.width = ScreenConfig.screenWidth - 100;
        // wl.alpha = 0.6f; //设置透明度
        // wl.gravity = Gravity.BOTTOM; //设置重力
        window.setAttributes(wl);
        window.setWindowAnimations(R.style.popwin_anim_style); // 设置窗口弹出动画
    }
    
}
public class ScreenConfig {
    public static int screenWidth;
    public static int screenHeigh;
}

values文件夹下的color.xml(我都忘了用了那些颜色了)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="BG_COLOR">#FFFFFF</color>
    <color name="WHITE">#FFFFFF</color>
    <color name="BLACK">#000000</color>
    <color name="GRAY">#CCCCCC</color>
    <color name="MAIN_GREEN">#409d23</color>
    
    <color name="GENERAL_ITEM_STROKE_COLOR">#999999</color>
    <color name="GENERAL_ITEM_STROKE_DOWN_COLOR">#D0F5C1</color>
    
    <color name="TITLE_BAR_BG">#409d23</color>
    <color name="LOGIN_BUTTON_COLOR">#4aac2c</color>
    <color name="LOGIN_FINDPASS_COLOR">#66c7ff</color>
    <color name="LOGIN_REGISTER_COLOR">#e8b61e</color>
    
    <color name="EDITINFO_GRAY_COLOR">#CCCCCC</color>
    <color name="EDITINFO_LEFT_TEXT_COLOR">#e8b61e</color>
    <color name="EDITINFO_RIGHT_TEXT_COLOR">#66c7ff</color>
    
    <color name="DIALOG_DIVIDER_COLOR">#CCCCCC</color>
    <color name="DIALOG_HEADER_BG_COLOR">#e7e6e6</color>
    <color name="DIALOG_BUTTON_KEYDOWN_COLOR">#CCCCCC</color>
    
    
    <color name="SETTING_EXIT_BUTTON1">#CC0000</color>
    <color name="SETTING_EXIT_BUTTON2">#990000</color>
    
    <color name="GENERAL_GREEN_BUTTON_UP">#409d23</color>
    <color name="GENERAL_GREEN_BUTTON_DOWN">#32781B</color>
    <color name="GENERAL_BLUE_BUTTON_UP">#66c7ff</color>
    <color name="GENERAL_BLUE_BUTTON_DOWN">#29B3FD</color>
    <color name="GENERAL_YELLOW_BUTTON_UP">#e8b61e</color>
    <color name="GENERAL_YELLOW_BUTTON_DOWN">#D4A416</color>

</resources>

values下的style.xml添加

     <style name="GeneralDialog" parent="@android:Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item> 
        <item name="android:windowBackground">@android:color/white</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>
    
     
    <style name="popwin_anim_style">
         <item name="android:windowEnterAnimation">@anim/menushow</item>
         <item name="android:windowExitAnimation">@anim/menuhide</item>
    </style>

anim文件夹下:

文件:menushow.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/decelerate_interpolator"
    >  
    <translate 
        android:fromXDelta="0"  
        android:toXDelta="0"  
        android:fromYDelta="-500"  
        android:toYDelta="0"  
        android:duration="500" /> 
        
    <alpha 
        android:fromAlpha="0.1"
        android:toAlpha="1.0"
        android:duration="500"/>
            
</set>

文件:menuhide.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">  
    <translate  
        android:fromXDelta="0"  
        android:toXDelta="0"  
        android:fromYDelta="0"  
        android:toYDelta="-500"  
        android:duration="500" />  
        
    <alpha 
        android:fromAlpha="1.0"
        android:toAlpha="0.1"
        android:duration="500"/>
</set>

使用方法:(基本跟那个AlertDialog一样)

        // create nickname dialog
        nameDialog = new CDialog(this);
        View nnView = inflater.inflate(R.layout.dialog_nickname_c, null);
        final TextView nameText = (TextView) nnView.findViewById(R.id.editText1);
        nameText.setText(nickname);
        nameDialog.setView(nnView);
        nameDialog.setTitle(R.string.editinfo_nickname);
        nameDialog.setCInterface(new CDialog.CInterface() {
            @Override
            public void confirm() {
                nickname = nameText.getText().toString();
                nicknameView.setText(nickname);
            }
            @Override
            public void cancel() {
            }
        });

如有改进或错误之处,不怜赐教。

原文地址:https://www.cnblogs.com/jinglingJuly/p/3402399.html