├── .gitignore
├── .idea
├── codeStyles
│ └── Project.xml
├── gradle.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── misc.xml
├── modules.xml
├── runConfigurations.xml
└── vcs.xml
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── timmy
│ │ └── tdialog
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── timmy
│ │ │ └── tdialogdemo
│ │ │ ├── MainActivity.java
│ │ │ ├── adapter
│ │ │ └── SimpleAdapter.java
│ │ │ ├── dialogfragment
│ │ │ ├── MyAlertDialogFragment.java
│ │ │ └── MyDialogFragment.java
│ │ │ ├── ui
│ │ │ ├── DialogEncapActivity.java
│ │ │ ├── DiffentDialogActivity.java
│ │ │ ├── NormalDFActivity.java
│ │ │ └── SystemDialog.java
│ │ │ └── 目标
│ └── res
│ │ ├── anim
│ │ ├── enter_scale_dialog.xml
│ │ ├── enter_translate_dialog.xml
│ │ ├── exit_scale_dialog.xml
│ │ └── exit_translate_dialog.xml
│ │ ├── drawable-v24
│ │ └── ic_launcher_foreground.xml
│ │ ├── drawable
│ │ ├── ic_launcher_background.xml
│ │ ├── selector_solid_topic.xml
│ │ ├── shape_solid_topic.xml
│ │ ├── shape_solid_white_10.xml
│ │ ├── shape_solid_white_4.xml
│ │ └── shape_stroke_gray_99.xml
│ │ ├── layout
│ │ ├── activity_dialog_encap.xml
│ │ ├── activity_diffent_dialog.xml
│ │ ├── activity_main.xml
│ │ ├── activity_normal_df.xml
│ │ ├── activity_system_dialog.xml
│ │ ├── dialog_change_avatar.xml
│ │ ├── dialog_click.xml
│ │ ├── dialog_custom.xml
│ │ ├── dialog_evaluate.xml
│ │ ├── dialog_home_ad.xml
│ │ ├── dialog_loading.xml
│ │ ├── dialog_loading_progress.xml
│ │ ├── dialog_recycler_test.xml
│ │ ├── dialog_share_recycler.xml
│ │ ├── dialog_simple.xml
│ │ ├── dialog_vb_convert.xml
│ │ ├── dialog_version_upgrde.xml
│ │ ├── dialog_version_upgrde_strong.xml
│ │ ├── fragment_my_dialog.xml
│ │ ├── item_share.xml
│ │ ├── item_simple_text.xml
│ │ └── view_simple_text.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_round.png
│ │ ├── img_home_ad_close.png
│ │ └── img_home_banner.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── timmy
│ └── tdialog
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── images
├── TDialog-fw.png
└── TDialog.gif
├── settings.gradle
└── tdialog
├── .gitignore
├── bintrayUpload.gradle
├── build.gradle
├── proguard-rules.pro
└── src
├── androidTest
└── java
│ └── com
│ └── timmy
│ └── tdialog
│ └── ExampleInstrumentedTest.java
├── main
├── AndroidManifest.xml
├── java
│ └── com
│ │ └── timmy
│ │ └── tdialog
│ │ ├── TDialog.java
│ │ ├── base
│ │ ├── BaseDialogFragment.java
│ │ ├── BindViewHolder.java
│ │ ├── TBaseAdapter.java
│ │ └── TController.java
│ │ ├── list
│ │ └── TListDialog.java
│ │ └── listener
│ │ ├── OnBindViewListener.java
│ │ └── OnViewClickListener.java
└── res
│ ├── layout
│ └── dialog_recycler.xml
│ └── values
│ └── strings.xml
└── test
└── java
└── com
└── timmy
└── tdialog
└── ExampleUnitTest.java
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 |
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
18 |
19 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | #### 前言
2 | >文章代码示例已放到Github上了,有需要的朋友可以去看下[TDialog](https://github.com/Timmy-zzh/TDialog),欢迎star和fork,项目会一直维护,有疑问可以提Issues或留言.
3 | ##### 文章目录
4 | * TDialog框架的由来
5 | * 框架使用解析
6 | * 框架原理解析
7 | ###### 正文开始前先来一波效果图
8 | 
9 | #### 一.TDialog的由来
10 | 所有框架的由来都是为了更方便,更高效的解决问题,TDialog也一样,是为了在项目中更高效的实现项目的弹窗效果
11 |
12 | TDialog是继承自DialogFragment进行封装的,大部分开发者在实现弹窗效果的时候,会首选系统提供的AlertDialog;
13 | 但是使用系统的Dialog在某些情况下会出现问题,最常见的场景是当手机屏幕旋转时Dialog弹窗会消失,并抛出一个系统,这个异常不会导致异常崩溃,因为Google开发者知道这个问题,并进行了处理.
14 | Dialog使用起来其实更简单,但是Google却是推荐尽量使用DialogFragment.
15 | ##### 1.DialogFragment的优点
16 | * DialogFragment 本身是 Fragment 的子类,有着和 Fragment 基本一样的生命周期,使用 DialogFragment 来管理对话框,当旋转屏幕和按下后退键的时候可以更好的管理其生命周期
17 | * 在手机配置变化导致 Activity 需要重新创建时,例如旋转屏幕,基于 DialogFragment 的对话框将会由 FragmentManager 自动重建,然而基于 Dialog 实现的对话框却没有这样的能力
18 | ####使用
19 | 1.添加依赖
20 | a. 在工程build.gradle文件repositories中添加
21 | ```
22 | repositories {
23 | ...
24 | jcenter()
25 | }
26 | ```
27 | b.在model下build.gradle文件添加
28 | ```
29 | implementation 'com.timmy.tdialog:tdialog:2.1.1'
30 | ```
31 | 2.Activity或者Fragment中使用
32 | ```
33 |
34 | new TDialog.Builder(getSupportFragmentManager())
35 | .setLayoutRes(R.layout.dialog_click) //设置弹窗展示的xml布局
36 | // .setDialogView(view) //设置弹窗布局,直接传入View
37 | .setWidth(600) //设置弹窗宽度(px)
38 | .setHeight(800) //设置弹窗高度(px)
39 | .setScreenWidthAspect(this, 0.8f) //设置弹窗宽度(参数aspect为屏幕宽度比例 0 - 1f)
40 | .setScreenHeightAspect(this, 0.3f) //设置弹窗高度(参数aspect为屏幕宽度比例 0 - 1f)
41 | .setGravity(Gravity.CENTER) //设置弹窗展示位置
42 | .setTag("DialogTest") //设置Tag
43 | .setDimAmount(0.6f) //设置弹窗背景透明度(0-1f)
44 | .setCancelableOutside(true) //弹窗在界面外是否可以点击取消
45 | .setDialogAnimationRes(R.style.animate_dialog) //设置弹窗动画
46 | .setOnDismissListener(new DialogInterface.OnDismissListener() { //弹窗隐藏时回调方法
47 | @Override
48 | public void onDismiss(DialogInterface dialog) {
49 | Toast.makeText(DiffentDialogActivity.this, "弹窗消失回调", Toast.LENGTH_SHORT).show();
50 | }
51 | })
52 | .setOnBindViewListener(new OnBindViewListener() { //通过BindViewHolder拿到控件对象,进行修改
53 | @Override
54 | public void bindView(BindViewHolder bindViewHolder) {
55 | bindViewHolder.setText(R.id.tv_content, "abcdef");
56 | bindViewHolder.setText(R.id.tv_title, "我是Title");
57 | }
58 | })
59 | .addOnClickListener(R.id.btn_left, R.id.btn_right, R.id.tv_title) //添加进行点击控件的id
60 | .setOnViewClickListener(new OnViewClickListener() { //View控件点击事件回调
61 | @Override
62 | public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
63 | switch (view.getId()) {
64 | case R.id.btn_left:
65 | Toast.makeText(DiffentDialogActivity.this, "left clicked", Toast.LENGTH_SHORT).show();
66 | break;
67 | case R.id.btn_right:
68 | Toast.makeText(DiffentDialogActivity.this, "right clicked", Toast.LENGTH_SHORT).show();
69 | tDialog.dismiss();
70 | break;
71 | case R.id.tv_title:
72 | Toast.makeText(DiffentDialogActivity.this, "title clicked", Toast.LENGTH_SHORT).show();
73 | viewHolder.setText(R.id.tv_title, "Title点击了");
74 | break;
75 | }
76 | }
77 | })
78 | .setOnKeyListener(new DialogInterface.OnKeyListener() {
79 | @Override
80 | public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
81 | return false;
82 | }
83 | })
84 | .create() //创建TDialog
85 | .show(); //展示
86 |
87 | ```
88 | 添加动画姿势
89 | ```
90 | 新建补间动画文件
91 | enter.xml
92 |
93 |
97 |
98 |
99 | exit.xml
100 |
101 |
105 |
106 |
107 | style.xml文件
108 |
112 | ```
113 | #### 使用方法解析
114 | TDialog的实现原理和系统Dialog原理差不多,主要使用Builder设计模式实现
115 | 1.创建弹窗,传入xml布局文件或者传入View控件,且自己设置背景色,因为默认是透明背景色
116 | ```
117 | new TDialog.Builder(getSupportFragmentManager())
118 | .setLayoutRes(R.layout.dialog_click)
119 | .setDialogView(view)
120 | .create()
121 | .show();
122 | ```
123 | 2.设置弹窗的宽高(如果不设置宽或者高,默认使用包裹内容的高度)
124 | ```
125 | new TDialog.Builder(getSupportFragmentManager())
126 | .setLayoutRes(R.layout.dialog_click)
127 | .setWidth(600) //设置弹窗固定宽度(单位:px)
128 | .setHeight(800)//设置弹窗固定高度
129 | .setScreenWidthAspect(Activity.this,0.5f) //动态设置弹窗宽度为屏幕宽度百分比(取值0-1f)
130 | .setScreenHeightAspect(Activity.this,0.6f)//设置弹窗高度为屏幕高度百分比(取值0-1f)
131 | .create()
132 | .show();
133 | ```
134 | 3.设置弹窗展示的位置
135 | ```
136 | .setGravity(Gravity.CENTER)
137 | 其他位置有:Gravity.Bottom / Gravity.LEFT等等和设置控件位置一样
138 | ```
139 | 4.设置弹窗背景色透明度(取值0-1f,0为全透明)
140 | ```
141 | .setDimAmount(0.6f)
142 | ```
143 | 5.设置弹窗外部是否可以点击取消(默认可点击取消),和设置弹窗是否可以取消(默认可取消),弹窗隐藏时回调方法
144 | ```
145 | .setCancelableOutside(true)
146 | .setOnDismissListener(new DialogInterface.OnDismissListener() { //弹窗隐藏时回调方法
147 | @Override
148 | public void onDismiss(DialogInterface dialog) {
149 | Toast.makeText(DiffentDialogActivity.this, "弹窗隐藏回调", Toast.LENGTH_SHORT).show();
150 | }
151 | })
152 | ```
153 | 6.当弹窗需要动态改变控件子view内容时,这里借鉴了RecyclerView.Adapter的设计思想,内部封装好一个BindViewHolder
154 | ```
155 | .setOnBindViewListener(new OnBindViewListener() {
156 | @Override
157 | public void bindView(BindViewHolder bindViewHolder) {
158 | bindViewHolder.setText(R.id.tv_content, "abcdef");
159 | bindViewHolder.setText(R.id.tv_title,"我是Title");
160 | }
161 | })
162 | ```
163 | 7.监听弹窗子控件的点击事件,内部也是通过BindViewHolder实现
164 | addOnClickListener(ids[])只需要将点击事件控件的id传入,并设置回调接口setOnViewClickListener()
165 | ```
166 | .addOnClickListener(R.id.btn_right, R.id.tv_title)
167 | .setOnViewClickListener(new OnViewClickListener() {
168 | @Override
169 | public void onViewClick(BindViewHolder viewHolder,View view1, TDialog tDialog) {
170 | switch (view1.getId()) {
171 | case R.id.btn_right:
172 | Toast.makeText(DialogEncapActivity.this, "btn_right", Toast.LENGTH_SHORT).show();
173 | tDialog.dismiss();
174 | break;
175 | case R.id.tv_title:
176 | Toast.makeText(DialogEncapActivity.this, "tv_title", Toast.LENGTH_SHORT).show();
177 | break;
178 | }
179 | }
180 | })
181 | ```
182 | 8.设置弹窗动画
183 | ```
184 | .setDialogAnimationRes(R.style.animate_dialog)
185 | ```
186 | 9.监听返回键点击事件,需配合setCancelableOutside(false)方法一起使用
187 | ```
188 | .setOnKeyListener(new DialogInterface.OnKeyListener() {
189 | @Override
190 | public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
191 | if (keyCode == KeyEvent.KEYCODE_BACK) {
192 | Toast.makeText(DiffentDialogActivity.this, "返回健无效,请强制升级后使用", Toast.LENGTH_SHORT).show();
193 | return true;
194 | }
195 | return false; //默认返回值
196 | }
197 | })
198 | ```
199 | a.列表弹窗-使用TListDialog,TListDialog继承自TDialog,可以使用父类所有的方法,并且扩展列表数据展示丰富setAdapter()和item点击事件回调方法setOnAdapterItemClickListener()
200 | ```
201 | new TListDialog.Builder(getSupportFragmentManager())
202 | .setHeight(600)
203 | .setScreenWidthAspect(this, 0.8f)
204 | .setGravity(Gravity.CENTER)
205 | .setAdapter(new TBaseAdapter(R.layout.item_simple_text, Arrays.asList(data)) {
206 |
207 | @Override
208 | protected void onBind(BindViewHolder holder, int position, String s) {
209 | holder.setText(R.id.tv, s);
210 | }
211 | })
212 | .setOnAdapterItemClickListener(new TBaseAdapter.OnAdapterItemClickListener() {
213 | @Override
214 | public void onItemClick(BindViewHolder holder, int position, String s, TDialog tDialog) {
215 | Toast.makeText(DiffentDialogActivity.this, "click:" + s, Toast.LENGTH_SHORT).show();
216 | tDialog.dismiss();
217 | }
218 | })
219 | .create()
220 | .show();
221 | ```
222 | ##### 列表弹窗
223 | 为了方便使用:
224 | 1. 不用传入layoutRes布局文件,TDialog内部设置了一个默认的RecyclerView布局,且RecyclerView的控件id为recycler_view,背景为#ffffff
225 | 2. setAdapter(Adapter),设置recyclerview的adapter,为了封装Adapter的item点击事件,传入的adapter需要为TBaseAdapter的实现类
226 | 3. setOnAdapterItemClickListener(),设置adapter的点击事件
227 | ```
228 |
229 |
236 | ```
237 | TBaseAdapter实现:需要使用者传入item的xml布局,和List数据
238 | ```
239 | public abstract class TBaseAdapter extends RecyclerView.Adapter {
240 |
241 | private final int layoutRes;
242 | private List datas;
243 | private OnAdapterItemClickListener adapterItemClickListener;
244 | private TDialog dialog;
245 |
246 | protected abstract void onBind(BindViewHolder holder, int position, T t);
247 |
248 | public TBaseAdapter(@LayoutRes int layoutRes, List datas) {
249 | this.layoutRes = layoutRes;
250 | this.datas = datas;
251 | }
252 |
253 | @Override
254 | public BindViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
255 | return new BindViewHolder(LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false));
256 | }
257 |
258 | @Override
259 | public void onBindViewHolder(final BindViewHolder holder, final int position) {
260 | onBind(holder, position, datas.get(position));
261 | holder.itemView.setOnClickListener(new View.OnClickListener() {
262 | @Override
263 | public void onClick(View v) {
264 | adapterItemClickListener.onItemClick(holder, position, datas.get(position), dialog);
265 | }
266 | });
267 | }
268 |
269 | @Override
270 | public int getItemCount() {
271 | return datas.size();
272 | }
273 |
274 | public void setTDialog(TDialog tDialog) {
275 | this.dialog = tDialog;
276 | }
277 |
278 | public interface OnAdapterItemClickListener {
279 | void onItemClick(BindViewHolder holder, int position, T t, TDialog tDialog);
280 | }
281 |
282 | public void setOnAdapterItemClickListener(OnAdapterItemClickListener listener) {
283 | this.adapterItemClickListener = listener;
284 | }
285 | }
286 | ```
287 | ##### 如果使用者需要使用自己的列表布局时,可以使用setListLayoutRes(layotuRes,LayoutManager)方法设置xml布局和布局管理器LayoutManager,切记xml布局中的RecyclerView的id必须设置为recycler_view(如效果图中的分享弹窗)
288 | ```
289 | //底部分享
290 | public void shareDialog(View view) {
291 | new TListDialog.Builder(getSupportFragmentManager())
292 | .setListLayoutRes(R.layout.dialog_share_recycler, LinearLayoutManager.HORIZONTAL)
293 | .setScreenWidthAspect(this, 1.0f)
294 | .setGravity(Gravity.BOTTOM)
295 | .setAdapter(new TBaseAdapter(R.layout.item_share, Arrays.asList(sharePlatform)) {
296 | @Override
297 | protected void onBind(BindViewHolder holder, int position, String s) {
298 | holder.setText(R.id.tv, s);
299 | }
300 | })
301 | .setOnAdapterItemClickListener(new TBaseAdapter.OnAdapterItemClickListener() {
302 | @Override
303 | public void onItemClick(BindViewHolder holder, int position, String item, TDialog tDialog) {
304 | Toast.makeText(DiffentDialogActivity.this, item, Toast.LENGTH_SHORT).show();
305 | tDialog.dismiss();
306 | }
307 | })
308 | .create()
309 | .show();
310 | }
311 | ```
312 | 自定义列表布局
313 | ```
314 |
315 |
321 |
322 |
332 |
333 |
340 |
341 |
342 | ```
343 | #### 框架原理解析
344 | TDialog的实现原理主要分为三步
345 | 1. 实例化TDialog.Builer对象builder,然后调用各种setXXX()方法设置数据,设置的数据都保存在TController.TParams实例中
346 | 2. create()方法调用后才会实例化TDialog对象,并将TController.TParams中设置的数据传递到TDialog的属性TController对象中
347 | 3. show()方法调用显示弹窗
348 | 4. UML调用时序图
349 | 
350 | #### 项目github地址:https://github.com/Timmy-zzh/TDialog
351 |
352 | ##### 版本历史
353 | ```
354 | 2.1.1版本:
355 | 添加返回键事件监听
356 | show()方法添加容错处理
357 |
358 | 2.0.0版本:
359 | 添加弹窗动画
360 | 修复show()方法调用时bug
361 | 去除setCancelable()方法
362 |
363 | 1.3.1版本:
364 | 添加弹窗隐藏时回调监听方法:setOnDismissListener()
365 |
366 | 1.3.0版本:
367 | 处理setCancelable()方法,禁止弹窗点击取消
368 | 弹窗内容直接传入View: setDialogView()
369 |
370 | 1.2.0版本:
371 | 分离出列表弹窗TListDialog
372 | 解决弹窗按Home键时出现的bug
373 |
374 | 1.1.0版本: 添加点击事件封装回调方法
375 | addOnClickListener()
376 | setOnViewClickListener()
377 |
378 | 1.0.0版本: 弹窗实现基本功能
379 | OnBindViewListener
380 | ```
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 27
5 | defaultConfig {
6 | applicationId "com.timmy.tdialog"
7 | minSdkVersion 15
8 | targetSdkVersion 27
9 | versionCode 211
10 | versionName "2.1.1"
11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
12 | }
13 | buildTypes {
14 | release {
15 | minifyEnabled false
16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
17 | }
18 | }
19 | }
20 |
21 | dependencies {
22 | implementation fileTree(dir: 'libs', include: ['*.jar'])
23 | implementation 'com.android.support:appcompat-v7:27.1.1'
24 | implementation 'com.android.support:support-v4:27.1.1'
25 |
26 | implementation 'com.android.support:support-v4:27.1.1'
27 | implementation 'com.android.support:recyclerview-v7:27.1.1'
28 |
29 | implementation 'com.android.support.constraint:constraint-layout:1.1.2'
30 | testImplementation 'junit:junit:4.12'
31 | androidTestImplementation 'com.android.support.test:runner:1.0.2'
32 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
33 | implementation project(':tdialog')
34 | }
35 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/timmy/tdialog/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumented test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() throws Exception {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.timmy.tdialog", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/timmy/tdialogdemo/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialogdemo;
2 |
3 | import android.content.Intent;
4 | import android.os.Handler;
5 | import android.os.HandlerThread;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.os.Bundle;
8 | import android.view.Gravity;
9 | import android.view.View;
10 | import android.widget.FrameLayout;
11 | import android.widget.LinearLayout;
12 | import android.widget.TextView;
13 | import android.widget.Toast;
14 |
15 | import com.timmy.tdialog.TDialog;
16 | import com.timmy.tdialog.base.BindViewHolder;
17 | import com.timmy.tdialog.listener.OnBindViewListener;
18 | import com.timmy.tdialog.listener.OnViewClickListener;
19 | import com.timmy.tdialogdemo.ui.DialogEncapActivity;
20 | import com.timmy.tdialogdemo.ui.DiffentDialogActivity;
21 | import com.timmy.tdialogdemo.ui.NormalDFActivity;
22 | import com.timmy.tdialogdemo.ui.SystemDialog;
23 |
24 | public class MainActivity extends AppCompatActivity {
25 |
26 | @Override
27 | protected void onCreate(Bundle savedInstanceState) {
28 | super.onCreate(savedInstanceState);
29 | setContentView(R.layout.activity_main);
30 | }
31 |
32 | /**
33 | * 系统Dialog使用
34 | *
35 | * @param view
36 | */
37 | public void systemDialog(View view) {
38 | startActivity(new Intent(this, SystemDialog.class));
39 | }
40 |
41 | /**
42 | * DialogFragment的使用
43 | *
44 | * @param view
45 | */
46 | public void NormalDF(View view) {
47 | startActivity(new Intent(this, NormalDFActivity.class));
48 | }
49 |
50 | /**
51 | * DialogFragment封装
52 | *
53 | * @param view
54 | */
55 | public void DialogEncap(View view) {
56 | startActivity(new Intent(this, DialogEncapActivity.class));
57 | }
58 |
59 | /**
60 | * 常用的各种Dialog
61 | *
62 | * @param view
63 | */
64 | public void diffentDialog(View view) {
65 | startActivity(new Intent(this, DiffentDialogActivity.class));
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/app/src/main/java/com/timmy/tdialogdemo/adapter/SimpleAdapter.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialogdemo.adapter;
2 |
3 | import android.support.v7.widget.RecyclerView;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.TextView;
8 |
9 | import com.timmy.tdialogdemo.R;
10 |
11 | import java.util.ArrayList;
12 | import java.util.List;
13 |
14 | /**
15 | * Created by Timmy on 2017/12/18.
16 | */
17 |
18 | public class SimpleAdapter extends RecyclerView.Adapter {
19 |
20 | private List mData;
21 |
22 | public SimpleAdapter(List mData) {
23 | this.mData = mData == null ? new ArrayList() : mData;
24 | }
25 |
26 | @Override
27 | public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
28 | View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_simple_text, parent, false);
29 | return new ViewHolder(view);
30 | }
31 |
32 | @Override
33 | public void onBindViewHolder(ViewHolder holder, int position) {
34 | String item = mData.get(position);
35 | holder.textView.setText(item);
36 | }
37 |
38 | @Override
39 | public int getItemCount() {
40 | return mData.size();
41 | }
42 |
43 | public class ViewHolder extends RecyclerView.ViewHolder {
44 |
45 | public TextView textView;
46 |
47 | public ViewHolder(View itemView) {
48 | super(itemView);
49 | textView = itemView.findViewById(R.id.tv);
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/app/src/main/java/com/timmy/tdialogdemo/dialogfragment/MyAlertDialogFragment.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialogdemo.dialogfragment;
2 |
3 | import android.app.Dialog;
4 | import android.content.DialogInterface;
5 | import android.os.Bundle;
6 | import android.support.annotation.NonNull;
7 | import android.support.v4.app.DialogFragment;
8 | import android.support.v7.app.AlertDialog;
9 | import android.util.Log;
10 |
11 | import com.timmy.tdialogdemo.R;
12 |
13 | /**
14 | * 采用返回Dialog的方式处理
15 | */
16 | public class MyAlertDialogFragment extends DialogFragment {
17 | public static final String TAG = MyDialogFragment.class.getName();
18 |
19 | public static MyAlertDialogFragment newInstance(String title) {
20 | MyAlertDialogFragment frag = new MyAlertDialogFragment();
21 | Bundle args = new Bundle();
22 | args.putString("title", title);
23 | frag.setArguments(args);
24 | return frag;
25 | }
26 |
27 | @NonNull
28 | @Override
29 | public Dialog onCreateDialog(Bundle savedInstanceState) {
30 | String title = getArguments().getString("title");
31 |
32 | return new AlertDialog.Builder(getActivity())
33 | .setIcon(R.mipmap.ic_launcher_round)
34 | .setTitle(title)
35 | .setPositiveButton("确定",
36 | new DialogInterface.OnClickListener() {
37 | public void onClick(DialogInterface dialog, int whichButton) {
38 | Log.d(TAG, "setPositiveButton");
39 | }
40 | }
41 | )
42 | .setNegativeButton("取消",
43 | new DialogInterface.OnClickListener() {
44 | public void onClick(DialogInterface dialog, int whichButton) {
45 | Log.d(TAG, "setNegativeButton");
46 | }
47 | }
48 | )
49 | .create();
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/app/src/main/java/com/timmy/tdialogdemo/dialogfragment/MyDialogFragment.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialogdemo.dialogfragment;
2 |
3 |
4 | import android.app.Dialog;
5 | import android.os.Bundle;
6 | import android.support.annotation.NonNull;
7 | import android.support.annotation.Nullable;
8 | import android.support.v4.app.DialogFragment;
9 | import android.util.Log;
10 | import android.view.LayoutInflater;
11 | import android.view.View;
12 | import android.view.ViewGroup;
13 | import android.widget.Button;
14 | import android.widget.TextView;
15 |
16 | import com.timmy.tdialogdemo.R;
17 |
18 | /**
19 | * 使用onCreateView返回Dialog的界面布局
20 | */
21 | public class MyDialogFragment extends DialogFragment {
22 |
23 | public static final String TAG = MyDialogFragment.class.getName();
24 |
25 | /**
26 | * 实例化,并传递数据
27 | */
28 | public static MyDialogFragment getInstance(int num) {
29 | MyDialogFragment dialogFragment = new MyDialogFragment();
30 | Bundle bundle = new Bundle();
31 | bundle.putInt("num", num);
32 | dialogFragment.setArguments(bundle);
33 | return dialogFragment;
34 | }
35 |
36 | @Override
37 | public void onCreate(@Nullable Bundle savedInstanceState) {
38 | super.onCreate(savedInstanceState);
39 | // int num = getArguments().getInt("num");
40 | // Log.d(TAG, "onCreate num:" + num);
41 | // //设置style类型
42 | // // Pick a style based on the num.
43 | // int style = DialogFragment.STYLE_NORMAL, theme = 0;
44 | // Log.d(TAG, "(num - 1) % 6:" + ((num - 1) % 6));
45 | // switch ((num - 1) % 6) {
46 | // case 1:
47 | // style = DialogFragment.STYLE_NO_TITLE;
48 | // break;
49 | // case 2:
50 | // style = DialogFragment.STYLE_NO_FRAME;
51 | // break;
52 | // case 3:
53 | // style = DialogFragment.STYLE_NO_INPUT;
54 | // break;
55 | // }
56 | // switch ((num - 1) % 6) {
57 | // case 1:
58 | // theme = android.R.style.Theme_Holo;
59 | // break;
60 | // case 2:
61 | // theme = android.R.style.Theme_Holo_Light_Dialog;
62 | // break;
63 | // case 3:
64 | // theme = android.R.style.Theme_Holo_Light;
65 | // break;
66 | // }
67 | // setStyle(style, theme);
68 |
69 | }
70 |
71 | @NonNull
72 | @Override
73 | public Dialog onCreateDialog(Bundle savedInstanceState) {
74 | return super.onCreateDialog(savedInstanceState);
75 | }
76 |
77 | @Nullable
78 | @Override
79 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
80 | Log.d(TAG, "onCreateView");
81 | View view = inflater.inflate(R.layout.fragment_my_dialog, container, false);
82 | TextView textView = view.findViewById(R.id.tv);
83 | textView.setText("DialogFragment");
84 | Button button = view.findViewById(R.id.btn);
85 | button.setOnClickListener(new View.OnClickListener() {
86 | @Override
87 | public void onClick(View v) {
88 | Log.d(TAG,"onClick");
89 | // ((NormalDFActivity) getActivity()).showDialogFragment(null);
90 | }
91 | });
92 | return view;
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/app/src/main/java/com/timmy/tdialogdemo/ui/DialogEncapActivity.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialogdemo.ui;
2 |
3 | import android.os.Bundle;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.view.Gravity;
6 | import android.view.View;
7 | import android.widget.Toast;
8 |
9 | import com.timmy.tdialog.TDialog;
10 | import com.timmy.tdialog.base.BindViewHolder;
11 | import com.timmy.tdialog.base.TBaseAdapter;
12 | import com.timmy.tdialog.list.TListDialog;
13 | import com.timmy.tdialog.listener.OnBindViewListener;
14 | import com.timmy.tdialog.listener.OnViewClickListener;
15 | import com.timmy.tdialogdemo.R;
16 |
17 | import java.util.ArrayList;
18 | import java.util.List;
19 |
20 | /**
21 | * DialogFragment封装
22 | */
23 | public class DialogEncapActivity extends AppCompatActivity {
24 |
25 | @Override
26 | protected void onCreate(Bundle savedInstanceState) {
27 | super.onCreate(savedInstanceState);
28 | setContentView(R.layout.activity_dialog_encap);
29 | }
30 |
31 | /**
32 | * 展示Dialog
33 | */
34 | public void showTDialog(View view) {
35 | new TDialog.Builder(getSupportFragmentManager())
36 | .setLayoutRes(R.layout.dialog_click)
37 | .setScreenWidthAspect(DialogEncapActivity.this, 0.8f)
38 | .setTag("DialogTest")
39 | .setDimAmount(0.6f)
40 | .setGravity(Gravity.CENTER)
41 | .setOnBindViewListener(new OnBindViewListener() {
42 | @Override
43 | public void bindView(BindViewHolder bindViewHolder) {
44 | bindViewHolder.setText(R.id.tv_content, "abcdef");
45 | }
46 | })
47 | .addOnClickListener(R.id.btn_right, R.id.tv_title)
48 | .setOnViewClickListener(new OnViewClickListener() {
49 | @Override
50 | public void onViewClick(BindViewHolder viewHolder, View view1, TDialog tDialog) {
51 | switch (view1.getId()) {
52 | case R.id.btn_right:
53 | Toast.makeText(DialogEncapActivity.this, "btn_right", Toast.LENGTH_SHORT).show();
54 | tDialog.dismiss();
55 | break;
56 | case R.id.tv_title:
57 | Toast.makeText(DialogEncapActivity.this, "tv_title", Toast.LENGTH_SHORT).show();
58 | break;
59 | }
60 | }
61 | })
62 | .create()
63 | .show();
64 | }
65 |
66 | public void showTListDialog(View view) {
67 | List datas = new ArrayList<>();
68 | for (int i = 0; i < 10; i++) {
69 | datas.add("item:" + i);
70 | }
71 |
72 | TListDialog.Builder builder = new TListDialog.Builder(getSupportFragmentManager());
73 | builder.setLayoutRes(R.layout.dialog_recycler_test);
74 | builder.setHeight(600);
75 | builder.setScreenWidthAspect(DialogEncapActivity.this, 1.0f);
76 | builder.setAdapter(new TBaseAdapter(R.layout.item_simple_text, datas) {
77 | @Override
78 | protected void onBind(BindViewHolder holder, int position, String item) {
79 | holder.setText(R.id.tv, item);
80 | }
81 | });
82 | builder.setOnAdapterItemClickListener(new TBaseAdapter.OnAdapterItemClickListener() {
83 | @Override
84 | public void onItemClick(BindViewHolder holder, int position, Object o, TDialog tDialog) {
85 | String item = (String) o;
86 | Toast.makeText(DialogEncapActivity.this, "pos:" + position + "," + item, Toast.LENGTH_SHORT).show();
87 | tDialog.dismiss();
88 | }
89 | });
90 | builder.setGravity(Gravity.BOTTOM);
91 |
92 | TDialog tListDialog = builder.create();
93 | tListDialog.show();
94 | }
95 |
96 | }
97 |
--------------------------------------------------------------------------------
/app/src/main/java/com/timmy/tdialogdemo/ui/DiffentDialogActivity.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialogdemo.ui;
2 |
3 | import android.content.Context;
4 | import android.content.DialogInterface;
5 | import android.os.Bundle;
6 | import android.os.Handler;
7 | import android.os.Message;
8 | import android.support.v7.app.AppCompatActivity;
9 | import android.support.v7.widget.LinearLayoutManager;
10 | import android.view.Gravity;
11 | import android.view.KeyEvent;
12 | import android.view.LayoutInflater;
13 | import android.view.View;
14 | import android.view.ViewGroup;
15 | import android.view.inputmethod.InputMethodManager;
16 | import android.widget.EditText;
17 | import android.widget.ProgressBar;
18 | import android.widget.TextView;
19 | import android.widget.Toast;
20 |
21 | import com.timmy.tdialog.TDialog;
22 | import com.timmy.tdialog.base.BindViewHolder;
23 | import com.timmy.tdialog.base.TBaseAdapter;
24 | import com.timmy.tdialog.list.TListDialog;
25 | import com.timmy.tdialog.listener.OnBindViewListener;
26 | import com.timmy.tdialog.listener.OnViewClickListener;
27 | import com.timmy.tdialogdemo.R;
28 |
29 | import java.util.Arrays;
30 |
31 | /**
32 | * 常用的各种Dialog
33 | */
34 | public class DiffentDialogActivity extends AppCompatActivity {
35 |
36 | private static final String TAG = "TDialog";
37 | private static final int WHAT_LOADING = 0;
38 | private static final int WHAT_PROGRESS = 1;
39 | private String[] data = {"java", "android", "NDK", "c++", "python", "ios", "Go", "Unity3D", "Kotlin", "Swift", "js"};
40 | private String[] sharePlatform = {"微信", "朋友圈", "短信", "微博", "QQ空间", "Google", "FaceBook", "微信", "朋友圈", "短信", "微博", "QQ空间"};
41 | private TDialog tDialog;
42 | int currProgress = 5;
43 | private ProgressBar progressBar;
44 | private TextView tvProgress;
45 |
46 |
47 | private Handler handler = new Handler() {
48 | @Override
49 | public void handleMessage(Message msg) {
50 | switch (msg.what) {
51 | case WHAT_LOADING:
52 | if (tDialog != null) {
53 | tDialog.dismiss();
54 | }
55 | return;
56 |
57 | case WHAT_PROGRESS:
58 | currProgress += 5;
59 | progressBar.setProgress(currProgress);
60 | tvProgress.setText("progress:" + currProgress + "/100");
61 | if (tDialog != null && currProgress >= 100) {
62 | currProgress = 0;
63 | tDialog.dismiss();
64 | tDialog = null;
65 | } else {
66 | handler.sendEmptyMessageDelayed(WHAT_PROGRESS, 1000);
67 | }
68 | return;
69 | }
70 | }
71 | };
72 |
73 | @Override
74 | protected void onCreate(Bundle savedInstanceState) {
75 | super.onCreate(savedInstanceState);
76 | setContentView(R.layout.activity_diffent_dialog);
77 | }
78 |
79 | public void testDialog(View view2) {
80 | View view = LayoutInflater.from(this).inflate(R.layout.dialog_loading, null);
81 | tDialog = new TDialog.Builder(getSupportFragmentManager())
82 | .setDialogView(view)
83 | .setCancelableOutside(false)
84 | .setOnKeyListener(new DialogInterface.OnKeyListener() {
85 | @Override
86 | public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
87 | Toast.makeText(DiffentDialogActivity.this, "keyCode:" + keyCode, Toast.LENGTH_SHORT).show();
88 | if (keyCode == KeyEvent.KEYCODE_BACK) {
89 |
90 | return true;
91 | }
92 | return false;
93 | }
94 | })
95 | .create();
96 | tDialog.show();
97 | }
98 |
99 | public void useTDialog(View view) {
100 | new TDialog.Builder(getSupportFragmentManager())
101 | .setLayoutRes(R.layout.dialog_click) //设置弹窗展示的xml布局
102 | // .setDialogView(view) //设置弹窗布局,直接传入View
103 | .setWidth(600) //设置弹窗宽度(px)
104 | .setHeight(800) //设置弹窗高度(px)
105 | .setScreenWidthAspect(this, 0.8f) //设置弹窗宽度(参数aspect为屏幕宽度比例 0 - 1f)
106 | .setScreenHeightAspect(this, 0.3f) //设置弹窗高度(参数aspect为屏幕宽度比例 0 - 1f)
107 | .setGravity(Gravity.CENTER) //设置弹窗展示位置
108 | .setTag("DialogTest") //设置Tag
109 | .setDimAmount(0.6f) //设置弹窗背景透明度(0-1f)
110 | .setCancelableOutside(true) //弹窗在界面外是否可以点击取消
111 | .setDialogAnimationRes(R.style.animate_dialog) //设置弹窗动画
112 | .setOnDismissListener(new DialogInterface.OnDismissListener() { //弹窗隐藏时回调方法
113 | @Override
114 | public void onDismiss(DialogInterface dialog) {
115 | Toast.makeText(DiffentDialogActivity.this, "弹窗消失回调", Toast.LENGTH_SHORT).show();
116 | }
117 | })
118 | .setOnBindViewListener(new OnBindViewListener() { //通过BindViewHolder拿到控件对象,进行修改
119 | @Override
120 | public void bindView(BindViewHolder bindViewHolder) {
121 | bindViewHolder.setText(R.id.tv_content, "abcdef");
122 | bindViewHolder.setText(R.id.tv_title, "我是Title");
123 | }
124 | })
125 | .addOnClickListener(R.id.btn_left, R.id.btn_right, R.id.tv_title) //添加进行点击控件的id
126 | .setOnViewClickListener(new OnViewClickListener() { //View控件点击事件回调
127 | @Override
128 | public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
129 | switch (view.getId()) {
130 | case R.id.btn_left:
131 | Toast.makeText(DiffentDialogActivity.this, "left clicked", Toast.LENGTH_SHORT).show();
132 | break;
133 | case R.id.btn_right:
134 | Toast.makeText(DiffentDialogActivity.this, "right clicked", Toast.LENGTH_SHORT).show();
135 | tDialog.dismiss();
136 | break;
137 | case R.id.tv_title:
138 | Toast.makeText(DiffentDialogActivity.this, "title clicked", Toast.LENGTH_SHORT).show();
139 | viewHolder.setText(R.id.tv_title, "Title点击了");
140 | break;
141 | }
142 | }
143 | })
144 | .setOnKeyListener(new DialogInterface.OnKeyListener() {
145 | @Override
146 | public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
147 | Toast.makeText(DiffentDialogActivity.this, "按键 keyCode:" + keyCode, Toast.LENGTH_SHORT).show();
148 | return false;
149 | }
150 | })
151 | .create() //创建TDialog
152 | .show(); //展示
153 | }
154 |
155 | public void upgradeDialog(View view) {
156 | new TDialog.Builder(getSupportFragmentManager())
157 | .setLayoutRes(R.layout.dialog_version_upgrde)
158 | .setScreenWidthAspect(this, 0.7f)
159 | .addOnClickListener(R.id.tv_cancel, R.id.tv_confirm)
160 | .setDialogAnimationRes(R.style.animate_dialog_scale)
161 | .setOnViewClickListener(new OnViewClickListener() {
162 | @Override
163 | public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
164 | switch (view.getId()) {
165 | case R.id.tv_cancel:
166 | tDialog.dismiss();
167 | break;
168 | case R.id.tv_confirm:
169 | Toast.makeText(DiffentDialogActivity.this, "开始下载新版本apk文件", Toast.LENGTH_SHORT).show();
170 | tDialog.dismiss();
171 | break;
172 | }
173 | }
174 | })
175 | .create()
176 | .show();
177 | }
178 |
179 | public void upgradeDialogStrong(View view) {
180 | new TDialog.Builder(getSupportFragmentManager())
181 | .setLayoutRes(R.layout.dialog_version_upgrde_strong)
182 | .setScreenWidthAspect(this, 0.7f)
183 | .addOnClickListener(R.id.tv_confirm)
184 | .setCancelableOutside(false)
185 | .setDialogAnimationRes(R.style.animate_dialog_scale)
186 | .setOnKeyListener(new DialogInterface.OnKeyListener() {
187 | @Override
188 | public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
189 | if (keyCode == KeyEvent.KEYCODE_BACK) {
190 | Toast.makeText(DiffentDialogActivity.this, "返回健无效,请强制升级后使用", Toast.LENGTH_SHORT).show();
191 | return true;
192 | }
193 | return false;
194 | }
195 | })
196 | .setOnViewClickListener(new OnViewClickListener() {
197 | @Override
198 | public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
199 | Toast.makeText(DiffentDialogActivity.this, "开始下载新版本apk文件", Toast.LENGTH_SHORT).show();
200 | }
201 | })
202 | .create()
203 | .show();
204 | }
205 |
206 | public void tipsDialog(View view) {
207 | new TDialog.Builder(getSupportFragmentManager())
208 | .setLayoutRes(R.layout.dialog_vb_convert)
209 | .setScreenWidthAspect(this, 0.85f)
210 | .setCancelableOutside(false)
211 | .addOnClickListener(R.id.tv_jiuyuan_desc, R.id.tv_cancel, R.id.tv_confirm)
212 | .setOnViewClickListener(new OnViewClickListener() {
213 | @Override
214 | public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
215 | switch (view.getId()) {
216 | case R.id.tv_jiuyuan_desc:
217 | Toast.makeText(DiffentDialogActivity.this, "进入说明界面", Toast.LENGTH_SHORT).show();
218 | break;
219 | case R.id.tv_cancel:
220 | tDialog.dismiss();
221 | break;
222 | case R.id.tv_confirm:
223 | Toast.makeText(DiffentDialogActivity.this, "执行优惠券兑换逻辑", Toast.LENGTH_SHORT).show();
224 | tDialog.dismiss();
225 | break;
226 | }
227 | }
228 | })
229 | .create()
230 | .show();
231 | }
232 |
233 | public void loadingDialog(View view) {
234 | tDialog = new TDialog.Builder(getSupportFragmentManager())
235 | .setLayoutRes(R.layout.dialog_loading)
236 | .setHeight(300)
237 | .setWidth(300)
238 | .setCancelableOutside(false)
239 | .create()
240 | .show();
241 | handler.sendEmptyMessageDelayed(WHAT_LOADING, 5 * 1000);
242 | }
243 |
244 | public void progressDialog(final View view) {
245 | tDialog = new TDialog.Builder(getSupportFragmentManager())
246 | .setLayoutRes(R.layout.dialog_loading_progress)
247 | .setScreenWidthAspect(this, 0.8f)
248 | .setCancelableOutside(true)
249 | .setOnBindViewListener(new OnBindViewListener() {
250 | @Override
251 | public void bindView(BindViewHolder viewHolder) {
252 | progressBar = viewHolder.getView(R.id.progress_bar);
253 | tvProgress = viewHolder.getView(R.id.tv_progress);
254 | }
255 | })
256 | .setOnDismissListener(new DialogInterface.OnDismissListener() {
257 | @Override
258 | public void onDismiss(DialogInterface dialog) {
259 | handler.removeMessages(WHAT_PROGRESS);
260 | currProgress = 5;
261 | }
262 | })
263 | .create()
264 | .show();
265 | handler.sendEmptyMessageDelayed(WHAT_PROGRESS, 1000);
266 | }
267 |
268 | public void dialogView(View view) {
269 | TextView textView = new TextView(this);
270 | textView.setText("DialogView");
271 | textView.setTextSize(25);
272 | textView.setTextColor(getResources().getColor(android.R.color.holo_red_dark));
273 | textView.setBackgroundColor(getResources().getColor(android.R.color.holo_green_dark));
274 |
275 | tDialog = new TDialog.Builder(getSupportFragmentManager())
276 | .setLayoutRes(R.layout.dialog_loading)
277 | .setDialogView(textView)
278 | .setHeight(400)
279 | .setWidth(600)
280 | .setCancelableOutside(true)
281 | .create()
282 | .show();
283 | }
284 |
285 | public void homeBannerDialog(View view) {
286 | new TDialog.Builder(getSupportFragmentManager())
287 | .setLayoutRes(R.layout.dialog_home_ad)
288 | .setScreenHeightAspect(this, 0.7f)
289 | .setScreenWidthAspect(this, 0.8f)
290 | .setOnBindViewListener(new OnBindViewListener() {
291 | @Override
292 | public void bindView(BindViewHolder viewHolder) {
293 | //可对图片进行修改
294 | }
295 | })
296 | .addOnClickListener(R.id.iv_close)
297 | .setOnViewClickListener(new OnViewClickListener() {
298 | @Override
299 | public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
300 | tDialog.dismiss();
301 | }
302 | })
303 | .create()
304 | .show();
305 | }
306 |
307 | public void updateHead(View view) {
308 | new TDialog.Builder(getSupportFragmentManager())
309 | .setLayoutRes(R.layout.dialog_change_avatar)
310 | .setScreenWidthAspect(this, 1.0f)
311 | .setGravity(Gravity.BOTTOM)
312 | .setDialogAnimationRes(R.style.animate_dialog)
313 | .addOnClickListener(R.id.tv_open_camera, R.id.tv_open_album, R.id.tv_cancel)
314 | .setOnViewClickListener(new OnViewClickListener() {
315 | @Override
316 | public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
317 | switch (view.getId()) {
318 | case R.id.tv_open_camera:
319 | Toast.makeText(DiffentDialogActivity.this, "打开相机", Toast.LENGTH_SHORT).show();
320 | tDialog.dismiss();
321 | break;
322 | case R.id.tv_open_album:
323 | Toast.makeText(DiffentDialogActivity.this, "打开相册", Toast.LENGTH_SHORT).show();
324 | tDialog.dismiss();
325 | break;
326 | case R.id.tv_cancel:
327 |
328 | tDialog.dismiss();
329 | break;
330 | }
331 | }
332 | })
333 | .create()
334 | .show();
335 | }
336 |
337 | public void listDialog(View view) {
338 | new TListDialog.Builder(getSupportFragmentManager())
339 | .setHeight(600)
340 | .setScreenWidthAspect(this, 0.8f)
341 | .setGravity(Gravity.CENTER)
342 | .setAdapter(new TBaseAdapter(R.layout.item_simple_text, Arrays.asList(data)) {
343 |
344 | @Override
345 | protected void onBind(BindViewHolder holder, int position, String s) {
346 | holder.setText(R.id.tv, s);
347 | }
348 | })
349 | .setOnAdapterItemClickListener(new TBaseAdapter.OnAdapterItemClickListener() {
350 | @Override
351 | public void onItemClick(BindViewHolder holder, int position, String s, TDialog tDialog) {
352 | Toast.makeText(DiffentDialogActivity.this, "click:" + s, Toast.LENGTH_SHORT).show();
353 | tDialog.dismiss();
354 | }
355 | })
356 | .create()
357 | .show();
358 | }
359 |
360 | public void bottomListDialog(View view) {
361 | new TListDialog.Builder(getSupportFragmentManager())
362 | .setScreenHeightAspect(this, 0.5f)
363 | .setScreenWidthAspect(this, 1.0f)
364 | .setGravity(Gravity.BOTTOM)
365 | .setAdapter(new TBaseAdapter(R.layout.item_simple_text, Arrays.asList(data)) {
366 | @Override
367 | protected void onBind(BindViewHolder holder, int position, String s) {
368 | holder.setText(R.id.tv, s);
369 | }
370 | })
371 | .setOnAdapterItemClickListener(new TBaseAdapter.OnAdapterItemClickListener() {
372 | @Override
373 | public void onItemClick(BindViewHolder holder, int position, String s, TDialog tDialog) {
374 | Toast.makeText(DiffentDialogActivity.this, "click:" + s, Toast.LENGTH_SHORT).show();
375 | tDialog.dismiss();
376 | }
377 | })
378 | .setOnDismissListener(new DialogInterface.OnDismissListener() {
379 | @Override
380 | public void onDismiss(DialogInterface dialog) {
381 | Toast.makeText(DiffentDialogActivity.this, "setOnDismissListener 回调", Toast.LENGTH_SHORT).show();
382 | }
383 | })
384 | .create()
385 | .show();
386 | }
387 |
388 | //评价 弹出输入框
389 | public void evaluateDialog(View view) {
390 | new TDialog.Builder(getSupportFragmentManager())
391 | .setLayoutRes(R.layout.dialog_evaluate)
392 | .setScreenWidthAspect(this, 1.0f)
393 | .setGravity(Gravity.BOTTOM)
394 | .addOnClickListener(R.id.btn_evluate)
395 | .setOnBindViewListener(new OnBindViewListener() {
396 | @Override
397 | public void bindView(BindViewHolder viewHolder) {
398 | final EditText editText = viewHolder.getView(R.id.editText);
399 | editText.post(new Runnable() {
400 | @Override
401 | public void run() {
402 | InputMethodManager imm = (InputMethodManager) DiffentDialogActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
403 | imm.showSoftInput(editText, 0);
404 | }
405 | });
406 | }
407 | })
408 | .setOnViewClickListener(new OnViewClickListener() {
409 | @Override
410 | public void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog) {
411 | EditText editText = viewHolder.getView(R.id.editText);
412 | String content = editText.getText().toString().trim();
413 | Toast.makeText(DiffentDialogActivity.this, "评价内容:" + content, Toast.LENGTH_SHORT).show();
414 | tDialog.dismiss();
415 | }
416 | })
417 | .create()
418 | .show();
419 | }
420 |
421 | //底部分享
422 | public void shareDialog(View view) {
423 | new TListDialog.Builder(getSupportFragmentManager())
424 | .setListLayoutRes(R.layout.dialog_share_recycler, LinearLayoutManager.HORIZONTAL)
425 | .setScreenWidthAspect(this, 1.0f)
426 | .setGravity(Gravity.BOTTOM)
427 | .setAdapter(new TBaseAdapter(R.layout.item_share, Arrays.asList(sharePlatform)) {
428 | @Override
429 | protected void onBind(BindViewHolder holder, int position, String s) {
430 | holder.setText(R.id.tv, s);
431 | }
432 | })
433 | .setOnAdapterItemClickListener(new TBaseAdapter.OnAdapterItemClickListener() {
434 | @Override
435 | public void onItemClick(BindViewHolder holder, int position, String item, TDialog tDialog) {
436 | Toast.makeText(DiffentDialogActivity.this, item, Toast.LENGTH_SHORT).show();
437 | tDialog.dismiss();
438 | }
439 | })
440 | .create()
441 | .show();
442 | }
443 |
444 | }
445 |
--------------------------------------------------------------------------------
/app/src/main/java/com/timmy/tdialogdemo/ui/NormalDFActivity.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialogdemo.ui;
2 |
3 | import android.support.v4.app.DialogFragment;
4 | import android.support.v4.app.Fragment;
5 | import android.support.v4.app.FragmentTransaction;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.os.Bundle;
8 | import android.view.MenuItem;
9 | import android.view.View;
10 |
11 | import com.timmy.tdialogdemo.R;
12 | import com.timmy.tdialogdemo.dialogfragment.MyAlertDialogFragment;
13 | import com.timmy.tdialogdemo.dialogfragment.MyDialogFragment;
14 |
15 | /**
16 | * DialogFragment的使用
17 | */
18 | public class NormalDFActivity extends AppCompatActivity {
19 | int mStackLevel = 0;
20 |
21 | @Override
22 | protected void onCreate(Bundle savedInstanceState) {
23 | super.onCreate(savedInstanceState);
24 | setContentView(R.layout.activity_normal_df);
25 | if (getSupportActionBar() != null) {
26 | getSupportActionBar().setDisplayHomeAsUpEnabled(true);
27 | getSupportActionBar().setDisplayShowHomeEnabled(true);
28 | }
29 | }
30 |
31 | @Override
32 | public boolean onOptionsItemSelected(MenuItem item) {
33 | if (item.getItemId() == android.R.id.home) {
34 | onBackPressed();
35 | return true;
36 | }
37 | return super.onOptionsItemSelected(item);
38 | }
39 |
40 | public void showDialogFragment(View view) {
41 | mStackLevel++;
42 | // DialogFragment.show() will take care of adding the fragment
43 | // in a transaction. We also want to remove any currently showing
44 | // dialog, so make our own transaction and take care of that here.
45 | FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
46 | // Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
47 | // if (prev != null) {
48 | // ft.remove(prev);
49 | // }
50 | // ft.addToBackStack(null);
51 |
52 | // Create and show the dialog.
53 | DialogFragment newFragment = MyDialogFragment.getInstance(mStackLevel);
54 | newFragment.show(ft, "dialog");
55 | }
56 |
57 | public void showAlertDialogFragment(View view) {
58 | DialogFragment newFragment = MyAlertDialogFragment.newInstance("showAlertDialogFragment000");
59 | newFragment.show(getSupportFragmentManager(), "dialog");
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/app/src/main/java/com/timmy/tdialogdemo/ui/SystemDialog.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialogdemo.ui;
2 |
3 | import android.app.ProgressDialog;
4 | import android.content.DialogInterface;
5 | import android.support.v7.app.AlertDialog;
6 | import android.support.v7.app.AppCompatActivity;
7 | import android.os.Bundle;
8 | import android.view.KeyEvent;
9 | import android.view.LayoutInflater;
10 | import android.view.View;
11 | import android.widget.ProgressBar;
12 | import android.widget.Toast;
13 |
14 | import com.timmy.tdialogdemo.R;
15 |
16 | import static android.support.v4.os.LocaleListCompat.create;
17 |
18 | /**
19 | * 系统Dialog使用
20 | * List
21 | * 多选
22 | * 单选
23 | * 自定义
24 | */
25 | public class SystemDialog extends AppCompatActivity {
26 |
27 | private int selectPosition;
28 | String[] fruitArray = new String[]{"西瓜", "芒果", "哈密瓜", "荔枝", "火龙果", "波罗蜜"};
29 | boolean[] selectArray = new boolean[]{true, false, true, true, true, false};
30 |
31 | @Override
32 | protected void onCreate(Bundle savedInstanceState) {
33 | super.onCreate(savedInstanceState);
34 | setContentView(R.layout.activity_system_dialog);
35 | // android.app.AlertDialog
36 | }
37 |
38 | public void btnDialog1(View view) {
39 | AlertDialog.Builder builder = new AlertDialog.Builder(this)
40 | .setMessage("内容")
41 | .setIcon(R.mipmap.ic_launcher_round)
42 | .setPositiveButton("确定", new DialogInterface.OnClickListener() {
43 | @Override
44 | public void onClick(DialogInterface dialog, int which) {
45 | Toast.makeText(SystemDialog.this, "确定Click", Toast.LENGTH_SHORT).show();
46 | }
47 | });
48 |
49 | AlertDialog alertDialog = builder.create();
50 | alertDialog.show();
51 |
52 | }
53 |
54 | public void btnDialog2(View view) {
55 | new AlertDialog.Builder(this)
56 | .setTitle("标题")
57 | .setMessage("内容")
58 | .setIcon(R.mipmap.ic_launcher_round)
59 | .setPositiveButton("确定", new DialogInterface.OnClickListener() {
60 | @Override
61 | public void onClick(DialogInterface dialog, int which) {
62 | Toast.makeText(SystemDialog.this, "确定Click", Toast.LENGTH_SHORT).show();
63 | }
64 | })
65 | .setNegativeButton("取消", new DialogInterface.OnClickListener() {
66 | @Override
67 | public void onClick(DialogInterface dialog, int which) {
68 | Toast.makeText(SystemDialog.this, "取消Click", Toast.LENGTH_SHORT).show();
69 | }
70 | })
71 | .setNeutralButton("下次提醒", new DialogInterface.OnClickListener() {
72 | @Override
73 | public void onClick(DialogInterface dialog, int which) {
74 | Toast.makeText(SystemDialog.this, "下次提醒Click", Toast.LENGTH_SHORT).show();
75 | }
76 | })
77 | .create()
78 | .show();
79 | }
80 |
81 | public void btnDialog3(View view) {
82 | new AlertDialog.Builder(this)
83 | .setTitle("你喜欢吃下列哪种水果?")
84 | .setIcon(R.mipmap.ic_launcher)
85 | .setItems(fruitArray, new DialogInterface.OnClickListener() {
86 | @Override
87 | public void onClick(DialogInterface dialog, int i) {
88 | Toast.makeText(SystemDialog.this, "你选择了" + fruitArray[i], Toast.LENGTH_SHORT).show();
89 | dialog.dismiss();
90 | }
91 | })
92 | .setNegativeButton("取消", new DialogInterface.OnClickListener() {
93 | @Override
94 | public void onClick(DialogInterface dialog, int i) {
95 | dialog.dismiss();
96 | }
97 | })
98 | .create()
99 | .show();
100 | }
101 |
102 | public void btnDialog4(View view) {
103 | new AlertDialog.Builder(this)
104 | .setTitle("你喜欢吃下列哪种水果?")
105 | .setIcon(R.mipmap.ic_launcher)
106 | .setSingleChoiceItems(fruitArray, 0, new DialogInterface.OnClickListener() {
107 | @Override
108 | public void onClick(DialogInterface dialogInterface, int i) {
109 | selectPosition = i;
110 | }
111 | })
112 | .setPositiveButton("确定", new DialogInterface.OnClickListener() {
113 | @Override
114 | public void onClick(DialogInterface dialog, int i) {
115 | Toast.makeText(SystemDialog.this, "你选择了" + fruitArray[selectPosition], Toast.LENGTH_SHORT).show();
116 | dialog.dismiss();
117 | }
118 | })
119 | .setNegativeButton("取消", new DialogInterface.OnClickListener() {
120 | @Override
121 | public void onClick(DialogInterface dialog, int i) {
122 | dialog.dismiss();
123 | }
124 | })
125 | .create()
126 | .show();
127 | }
128 |
129 | public void btnDialog5(View view) {
130 | new AlertDialog.Builder(this)
131 | .setMultiChoiceItems(fruitArray, selectArray, new DialogInterface.OnMultiChoiceClickListener() {
132 | @Override
133 | public void onClick(DialogInterface dialogInterface, int i, boolean b) {
134 | selectArray[i] = b;
135 | }
136 | })
137 | .setPositiveButton("确定", new DialogInterface.OnClickListener() {
138 | @Override
139 | public void onClick(DialogInterface dialog, int i) {
140 | Toast.makeText(SystemDialog.this, "你选择了", Toast.LENGTH_SHORT).show();
141 | dialog.dismiss();
142 | }
143 | })
144 | .setNegativeButton("取消", new DialogInterface.OnClickListener() {
145 | @Override
146 | public void onClick(DialogInterface dialog, int i) {
147 | dialog.dismiss();
148 | }
149 | })
150 | .create()
151 | .show();
152 | }
153 |
154 | public void btnDialog7(View view) {
155 | LayoutInflater layoutInflate = LayoutInflater.from(this);
156 | View customView = layoutInflate.inflate(R.layout.dialog_custom, null);
157 | AlertDialog customDialog = new AlertDialog.Builder(this)
158 | // .setTitle("标题")
159 | .setIcon(R.mipmap.ic_launcher)
160 | .setView(customView)
161 | .setPositiveButton("确定", new DialogInterface.OnClickListener() {
162 | @Override
163 | public void onClick(DialogInterface dialog, int i) {
164 | dialog.dismiss();
165 | }
166 | })
167 | .setNegativeButton("取消", new DialogInterface.OnClickListener() {
168 | @Override
169 | public void onClick(DialogInterface dialog, int i) {
170 | dialog.dismiss();
171 | }
172 | })
173 | .create();
174 | customDialog.show();
175 | }
176 |
177 | public void btnDialog8(View view) {
178 | View customTitle = LayoutInflater.from(this).inflate(R.layout.view_simple_text, null);
179 | new AlertDialog.Builder(this)
180 | // .setTitle("标题")
181 | .setMessage("内容")
182 | .setCustomTitle(customTitle)
183 | // .setCancelable(true)
184 | .setOnCancelListener(new DialogInterface.OnCancelListener() {
185 | @Override
186 | public void onCancel(DialogInterface dialog) {
187 |
188 | }
189 | })
190 | .setOnDismissListener(new DialogInterface.OnDismissListener() {
191 | @Override
192 | public void onDismiss(DialogInterface dialog) {
193 | }
194 | })
195 | .setOnKeyListener(new DialogInterface.OnKeyListener() {
196 | @Override
197 | public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
198 | return false;
199 | }
200 | })
201 | .setPositiveButton("OK", new DialogInterface.OnClickListener() {
202 | @Override
203 | public void onClick(DialogInterface dialog, int i) {
204 | dialog.dismiss();
205 | }
206 | })
207 | .create()
208 | .show();
209 | }
210 |
211 | public void progressDialog(View view) {
212 | ProgressDialog progressDialog = new ProgressDialog(this);
213 | // progressDialog.setTitle("加载中");
214 | progressDialog.setMessage("拼命加载中...");
215 | progressDialog.show();
216 |
217 | // ProgressBar progressBar = new ProgressBar(this);
218 | }
219 | }
220 |
--------------------------------------------------------------------------------
/app/src/main/java/com/timmy/tdialogdemo/目标:
--------------------------------------------------------------------------------
1 | //该项目是为创建一个可以通用的Dialog框架作为目标名字叫TDialog
2 | 抓哟使用的技术点是对DialogFragment进行封装
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/enter_scale_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/enter_translate_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/exit_scale_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/exit_translate_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/selector_solid_topic.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | -
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | -
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shape_solid_topic.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shape_solid_white_10.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shape_solid_white_4.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/shape_stroke_gray_99.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_dialog_encap.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
17 |
18 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_diffent_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
10 |
11 |
21 |
22 |
31 |
32 |
40 |
41 |
49 |
50 |
58 |
59 |
60 |
69 |
70 |
79 |
80 |
89 |
90 |
98 |
99 |
107 |
108 |
116 |
117 |
126 |
127 |
135 |
136 |
144 |
145 |
153 |
154 |
155 |
156 |
157 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
40 |
41 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_normal_df.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
23 |
24 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_system_dialog.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
19 |
20 |
26 |
27 |
33 |
34 |
40 |
41 |
47 |
48 |
54 |
55 |
61 |
62 |
68 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_change_avatar.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
16 |
17 |
28 |
29 |
37 |
38 |
49 |
50 |
58 |
59 |
70 |
71 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_click.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
19 |
20 |
32 |
33 |
42 |
43 |
52 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_custom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
13 |
14 |
20 |
21 |
28 |
29 |
35 |
36 |
42 |
43 |
49 |
50 |
56 |
57 |
62 |
63 |
68 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_evaluate.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
23 |
24 |
33 |
34 |
43 |
44 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_home_ad.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
15 |
16 |
22 |
23 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_loading.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_loading_progress.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
44 |
45 |
54 |
55 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_recycler_test.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_share_recycler.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
19 |
20 |
27 |
28 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_simple.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
21 |
22 |
29 |
30 |
40 |
41 |
49 |
50 |
58 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_vb_convert.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
20 |
21 |
27 |
28 |
41 |
42 |
53 |
54 |
60 |
61 |
74 |
75 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_version_upgrde.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
20 |
21 |
35 |
36 |
43 |
44 |
51 |
52 |
65 |
66 |
74 |
75 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_version_upgrde_strong.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
20 |
21 |
35 |
36 |
43 |
44 |
51 |
52 |
65 |
66 |
67 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_my_dialog.xml:
--------------------------------------------------------------------------------
1 |
9 |
10 |
21 |
22 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_share.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
15 |
16 |
23 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/item_simple_text.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/view_simple_text.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/img_home_ad_close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-xhdpi/img_home_ad_close.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/img_home_banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-xhdpi/img_home_banner.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 | #ffffff
7 |
8 |
9 | #f1f1f1
10 | #f1f1f1
11 |
12 |
13 | #242424
14 | #262626
15 |
16 | #ffffff
17 |
18 | #545454
19 |
20 | #757575
21 |
22 | #666666
23 |
24 | #999999
25 | #f6f6f6
26 |
27 | #000000
28 |
29 | #bdbdbd
30 | #dbdbdb
31 | #b6b6b6
32 | #4c85ff
33 | #ef965e
34 | #555555
35 | #333333
36 | #627984
37 | #aa627984
38 | #4D4D4D
39 | #D9D9D9
40 | #F2F2F2
41 | #2BB0FC
42 |
43 |
44 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | TDialog
3 |
4 |
5 | Hello blank fragment
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
15 |
16 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/test/java/com/timmy/tdialog/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 |
5 | repositories {
6 | google()
7 | jcenter()
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:3.2.1'
11 | classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
12 | classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
13 |
14 |
15 | // NOTE: Do not place your application dependencies here; they belong
16 | // in the individual module build.gradle files
17 | }
18 | }
19 |
20 | allprojects {
21 | repositories {
22 | google()
23 | jcenter()
24 | }
25 | }
26 |
27 | task clean(type: Delete) {
28 | delete rootProject.buildDir
29 | }
30 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 | #org.gradle.java.home=F\:\\Develop-Tools\\jdk
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Nov 16 22:45:12 CST 2018
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/images/TDialog-fw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/images/TDialog-fw.png
--------------------------------------------------------------------------------
/images/TDialog.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Timmy-zzh/TDialog/e779e909996f51516d2d61f1896981b35e1317b0/images/TDialog.gif
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':tdialog'
2 |
--------------------------------------------------------------------------------
/tdialog/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/tdialog/bintrayUpload.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.jfrog.bintray'
2 | apply plugin: 'com.github.dcendents.android-maven'
3 |
4 | def siteUrl = 'https://github.com/Timmy-zzh/TDialog' // 项目的主页
5 | def gitUrl = 'https://github.com/Timmy-zzh/TDialog.git' // Git仓库的url
6 |
7 | version = "2.1.1" //发布版本号
8 | group = "com.timmy.tdialog" //最终引用形式,如compile 'com.timmy.tdialog:1.0.0',其中tdialog在后面配置
9 |
10 | install {
11 | repositories.mavenInstaller {
12 | // This generates POM.xml with proper parameters
13 | pom {
14 | project {
15 | packaging 'aar'
16 | // Add your description here
17 | name 'Timmy Android Library 11'
18 | description 'timmy open library TDialog'
19 | url siteUrl
20 | // Set your license
21 | licenses {
22 | license {
23 | name 'The Apache Software License, Version 2.0'
24 | url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
25 | }
26 | }
27 | developers {
28 | developer {
29 | id 'timmy ' //填写bintray或者github的用户名
30 | name 'timmy ' //姓名
31 | email 'timmy.zzh@gmail.com'//邮箱
32 | }
33 | }
34 | scm {
35 | connection gitUrl
36 | developerConnection gitUrl
37 | url siteUrl
38 | }
39 | }
40 | }
41 | }
42 | }
43 | task sourcesJar(type: Jar) {
44 | from android.sourceSets.main.java.srcDirs
45 | classifier = 'sources'
46 | }
47 | task javadoc(type: Javadoc) {
48 | failOnError false //必须添加以免出错
49 | source = android.sourceSets.main.java.srcDirs
50 | classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
51 | }
52 | task javadocJar(type: Jar, dependsOn: javadoc) {
53 | classifier = 'javadoc'
54 | from javadoc.destinationDir
55 | }
56 | artifacts {
57 | archives javadocJar
58 | archives sourcesJar
59 | }
60 |
61 | Properties properties = new Properties()
62 | // 加载本地配置
63 | properties.load(project.rootProject.file('local.properties').newDataInputStream())
64 |
65 | bintray {
66 | user = properties.getProperty("bintray.user")
67 | key = properties.getProperty("bintray.apikey")
68 | configurations = ['archives']
69 | pkg {
70 | repo = 'maven'//自己创建的仓库名字
71 | name = 'tdialog'//发布到JCenter上的项目名字
72 | websiteUrl = siteUrl
73 | vcsUrl = gitUrl
74 | licenses = ['Apache-2.0']//不能随便写,只能是仓库创建时选择的license type
75 | publish = true // 是否是公开项目,公开别人可以引用
76 | }
77 | }
78 |
79 | javadoc {
80 | options{
81 | //如果你的项目里面有中文注释的话,必须将格式设置为UTF-8,不然会出现乱码
82 | encoding "UTF-8"
83 | charSet 'UTF-8'
84 | author true
85 | version true
86 | links "http://docs.oracle.com/javase/7/docs/api"
87 | }
88 | }
--------------------------------------------------------------------------------
/tdialog/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | android {
4 | compileSdkVersion 27
5 |
6 | defaultConfig {
7 | minSdkVersion 14
8 | targetSdkVersion 27
9 | versionCode 1
10 | versionName "1.0"
11 |
12 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
13 |
14 | }
15 |
16 | buildTypes {
17 | release {
18 | minifyEnabled false
19 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
20 | }
21 | }
22 | }
23 |
24 | dependencies {
25 | implementation fileTree(dir: 'libs', include: ['*.jar'])
26 | compileOnly 'com.android.support:support-v4:27.1.1'
27 | compileOnly 'com.android.support:recyclerview-v7:27.1.1'
28 | }
29 |
30 | apply from: 'bintrayUpload.gradle'
31 |
--------------------------------------------------------------------------------
/tdialog/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/tdialog/src/androidTest/java/com/timmy/tdialog/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog;
2 |
3 | import android.content.Context;
4 | import android.support.test.InstrumentationRegistry;
5 | import android.support.test.runner.AndroidJUnit4;
6 |
7 | import org.junit.Test;
8 | import org.junit.runner.RunWith;
9 |
10 | import static org.junit.Assert.*;
11 |
12 | /**
13 | * Instrumented test, which will execute on an Android device.
14 | *
15 | * @see Testing documentation
16 | */
17 | @RunWith(AndroidJUnit4.class)
18 | public class ExampleInstrumentedTest {
19 | @Test
20 | public void useAppContext() throws Exception {
21 | // Context of the app under test.
22 | Context appContext = InstrumentationRegistry.getTargetContext();
23 |
24 | assertEquals("com.timmy.tdialog.test", appContext.getPackageName());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/tdialog/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
--------------------------------------------------------------------------------
/tdialog/src/main/java/com/timmy/tdialog/TDialog.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog;
2 |
3 | import android.app.Activity;
4 | import android.app.Dialog;
5 | import android.content.Context;
6 | import android.content.DialogInterface;
7 | import android.os.Bundle;
8 | import android.support.annotation.FloatRange;
9 | import android.support.annotation.LayoutRes;
10 | import android.support.annotation.Nullable;
11 | import android.support.v4.app.DialogFragment;
12 | import android.support.v4.app.FragmentManager;
13 | import android.support.v4.app.FragmentTransaction;
14 | import android.support.v7.widget.LinearLayoutManager;
15 | import android.support.v7.widget.RecyclerView;
16 | import android.util.Log;
17 | import android.view.View;
18 |
19 | import com.timmy.tdialog.base.BaseDialogFragment;
20 | import com.timmy.tdialog.base.BindViewHolder;
21 | import com.timmy.tdialog.base.TBaseAdapter;
22 | import com.timmy.tdialog.base.TController;
23 | import com.timmy.tdialog.listener.OnBindViewListener;
24 | import com.timmy.tdialog.listener.OnViewClickListener;
25 |
26 | /**
27 | * 1.0.0版本: 弹窗实现基本功能
28 | * OnBindViewListener
29 | * 1.1.0版本: 添加点击事件封装回调方法
30 | * addOnClickListener()
31 | * setOnViewClickListener()
32 | * 1.2.0版本:
33 | * 分离出列表弹窗TListDialog
34 | * 解决弹窗按Home键时出现的bug
35 | * 1.3.0版本:
36 | * 处理setCancelable()方法,禁止弹窗点击取消
37 | * 弹窗内容直接传入View: setDialogView()
38 | * 1.3.1版本:
39 | * 添加弹窗隐藏时回调监听方法:setOnDismissListener()
40 | *
41 | * @author Timmy
42 | * @time 2018/1/4 16:28
43 | * @GitHub https://github.com/Timmy-zzh/TDialog
44 | **/
45 | public class TDialog extends BaseDialogFragment {
46 |
47 | private static final String KEY_TCONTROLLER = "TController";
48 | protected TController tController;
49 |
50 | public TDialog() {
51 | tController = new TController();
52 | }
53 |
54 | /**
55 | * 当设备旋转时,会重新调用onCreate,进行数据恢复
56 | */
57 | @Override
58 | public void onCreate(@Nullable Bundle savedInstanceState) {
59 | super.onCreate(savedInstanceState);
60 | if (savedInstanceState != null) {
61 | tController = (TController) savedInstanceState.getSerializable(KEY_TCONTROLLER);
62 | }
63 | }
64 |
65 | /**
66 | * 进行数据保存
67 | */
68 | @Override
69 | public void onSaveInstanceState(Bundle outState) {
70 | outState.putParcelable(KEY_TCONTROLLER, tController);
71 | super.onSaveInstanceState(outState);
72 | }
73 |
74 | /**
75 | * 弹窗消失时回调方法
76 | */
77 | @Override
78 | public void onDismiss(DialogInterface dialog) {
79 | super.onDismiss(dialog);
80 | DialogInterface.OnDismissListener onDismissListener = tController.getOnDismissListener();
81 | if (onDismissListener != null) {
82 | onDismissListener.onDismiss(dialog);
83 | }
84 | }
85 |
86 | /**
87 | * 获取弹窗xml布局界面
88 | */
89 | @Override
90 | protected int getLayoutRes() {
91 | return tController.getLayoutRes();
92 | }
93 |
94 | @Override
95 | protected View getDialogView() {
96 | return tController.getDialogView();
97 | }
98 |
99 | @Override
100 | protected void bindView(View view) {
101 | //控件点击事件处理
102 | BindViewHolder viewHolder = new BindViewHolder(view, this);
103 | if (tController.getIds() != null && tController.getIds().length > 0) {
104 | for (int id : tController.getIds()) {
105 | viewHolder.addOnClickListener(id);
106 | }
107 | }
108 | //回调方法获取到布局,进行处理
109 | if (tController.getOnBindViewListener() != null) {
110 | tController.getOnBindViewListener().bindView(viewHolder);
111 | }
112 | }
113 |
114 | @Override
115 | public int getGravity() {
116 | return tController.getGravity();
117 | }
118 |
119 | @Override
120 | public float getDimAmount() {
121 | return tController.getDimAmount();
122 | }
123 |
124 | @Override
125 | public int getDialogHeight() {
126 | return tController.getHeight();
127 | }
128 |
129 | @Override
130 | public int getDialogWidth() {
131 | return tController.getWidth();
132 | }
133 |
134 | @Override
135 | public String getFragmentTag() {
136 | return tController.getTag();
137 | }
138 |
139 | public OnViewClickListener getOnViewClickListener() {
140 | return tController.getOnViewClickListener();
141 | }
142 |
143 | @Override
144 | protected boolean isCancelableOutside() {
145 | return tController.isCancelableOutside();
146 | }
147 |
148 | @Override
149 | protected int getDialogAnimationRes() {
150 | return tController.getDialogAnimationRes();
151 | }
152 |
153 | @Override
154 | protected DialogInterface.OnKeyListener getOnKeyListener() {
155 | return tController.getOnKeyListener();
156 | }
157 |
158 | public TDialog show() {
159 | Log.d(TAG, "show");
160 | try {
161 | FragmentTransaction ft = tController.getFragmentManager().beginTransaction();
162 | ft.add(this, tController.getTag());
163 | ft.commitAllowingStateLoss();
164 | } catch (Exception e) {
165 | Log.e("TDialog", e.toString());
166 | }
167 | return this;
168 | }
169 |
170 | /*********************************************************************
171 | * 使用Builder模式实现
172 | *
173 | */
174 | public static class Builder {
175 |
176 | TController.TParams params;
177 |
178 | public Builder(FragmentManager fragmentManager) {
179 | params = new TController.TParams();
180 | params.mFragmentManager = fragmentManager;
181 | }
182 |
183 | /**
184 | * 传入弹窗xmL布局文件
185 | *
186 | * @param layoutRes
187 | * @return
188 | */
189 | public Builder setLayoutRes(@LayoutRes int layoutRes) {
190 | params.mLayoutRes = layoutRes;
191 | return this;
192 | }
193 |
194 | /**
195 | * 直接传入控件
196 | *
197 | * @param view
198 | * @return
199 | */
200 | public Builder setDialogView(View view) {
201 | params.mDialogView = view;
202 | return this;
203 | }
204 |
205 | /**
206 | * 设置弹窗宽度(单位:像素)
207 | *
208 | * @param widthPx
209 | * @return
210 | */
211 | public Builder setWidth(int widthPx) {
212 | params.mWidth = widthPx;
213 | return this;
214 | }
215 |
216 | /**
217 | * 设置弹窗高度(px)
218 | *
219 | * @param heightPx
220 | * @return
221 | */
222 | public Builder setHeight(int heightPx) {
223 | params.mHeight = heightPx;
224 | return this;
225 | }
226 |
227 | /**
228 | * 设置弹窗宽度是屏幕宽度的比例 0 -1
229 | */
230 | public Builder setScreenWidthAspect(Context context, float widthAspect) {
231 | params.mWidth = (int) (getScreenWidth(context) * widthAspect);
232 | return this;
233 | }
234 |
235 | /**
236 | * 设置弹窗高度是屏幕高度的比例 0 -1
237 | */
238 | public Builder setScreenHeightAspect(Context context, float heightAspect) {
239 | params.mHeight = (int) (getScreenHeight(context) * heightAspect);
240 | return this;
241 | }
242 |
243 | /**
244 | * 设置弹窗在屏幕中显示的位置
245 | *
246 | * @param gravity
247 | * @return
248 | */
249 | public Builder setGravity(int gravity) {
250 | params.mGravity = gravity;
251 | return this;
252 | }
253 |
254 | /**
255 | * 设置弹窗在弹窗区域外是否可以取消
256 | *
257 | * @param cancel
258 | * @return
259 | */
260 | public Builder setCancelableOutside(boolean cancel) {
261 | params.mIsCancelableOutside = cancel;
262 | return this;
263 | }
264 |
265 | /**
266 | * 弹窗dismiss时监听回调方法
267 | *
268 | * @param dismissListener
269 | * @return
270 | */
271 | public Builder setOnDismissListener(DialogInterface.OnDismissListener dismissListener) {
272 | params.mOnDismissListener = dismissListener;
273 | return this;
274 | }
275 |
276 |
277 | /**
278 | * 设置弹窗背景透明度(0-1f)
279 | *
280 | * @param dim
281 | * @return
282 | */
283 | public Builder setDimAmount(float dim) {
284 | params.mDimAmount = dim;
285 | return this;
286 | }
287 |
288 | public Builder setTag(String tag) {
289 | params.mTag = tag;
290 | return this;
291 | }
292 |
293 | /**
294 | * 通过回调拿到弹窗布局控件对象
295 | *
296 | * @param listener
297 | * @return
298 | */
299 | public Builder setOnBindViewListener(OnBindViewListener listener) {
300 | params.bindViewListener = listener;
301 | return this;
302 | }
303 |
304 | /**
305 | * 添加弹窗控件的点击事件
306 | *
307 | * @param ids 传入需要点击的控件id
308 | * @return
309 | */
310 | public Builder addOnClickListener(int... ids) {
311 | params.ids = ids;
312 | return this;
313 | }
314 |
315 | /**
316 | * 弹窗控件点击回调
317 | *
318 | * @param listener
319 | * @return
320 | */
321 | public Builder setOnViewClickListener(OnViewClickListener listener) {
322 | params.mOnViewClickListener = listener;
323 | return this;
324 | }
325 |
326 | /**
327 | * 设置弹窗动画
328 | *
329 | * @param animationRes
330 | * @return
331 | */
332 | public Builder setDialogAnimationRes(int animationRes) {
333 | params.mDialogAnimationRes = animationRes;
334 | return this;
335 | }
336 |
337 | /**
338 | * 监听弹窗后,返回键点击事件
339 | */
340 | public Builder setOnKeyListener(DialogInterface.OnKeyListener keyListener) {
341 | params.mKeyListener = keyListener;
342 | return this;
343 | }
344 |
345 | /**
346 | * 真正创建TDialog对象实例
347 | *
348 | * @return
349 | */
350 | public TDialog create() {
351 | TDialog dialog = new TDialog();
352 | Log.d(TAG, "create");
353 | //将数据从Buidler的DjParams中传递到DjDialog中
354 | params.apply(dialog.tController);
355 | return dialog;
356 | }
357 | }
358 | }
359 |
--------------------------------------------------------------------------------
/tdialog/src/main/java/com/timmy/tdialog/base/BaseDialogFragment.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog.base;
2 |
3 | import android.app.Dialog;
4 | import android.content.Context;
5 | import android.content.DialogInterface;
6 | import android.graphics.Color;
7 | import android.graphics.drawable.ColorDrawable;
8 | import android.os.Bundle;
9 | import android.support.annotation.NonNull;
10 | import android.support.annotation.Nullable;
11 | import android.support.v4.app.DialogFragment;
12 | import android.support.v4.app.FragmentManager;
13 | import android.view.Gravity;
14 | import android.view.LayoutInflater;
15 | import android.view.View;
16 | import android.view.ViewGroup;
17 | import android.view.Window;
18 | import android.view.WindowManager;
19 |
20 | import com.timmy.tdialog.R;
21 |
22 | /**
23 | * DialogFragment的基类
24 | * 1.系统默认onCreateDialog方法返回一个Dialog对象,对其不做处理
25 | * 2.主要操作onCreateView方法
26 | * 因为DialogFragment继承自Fragment,所以可以在onCreteView()方法返回xml布局,
27 | * 该布局在onActivityCreated()方法中,设置给系统之前创建的Dialog对象
28 | * // @Override
29 | * // public void onActivityCreated(Bundle savedInstanceState) {
30 | * // super.onActivityCreated(savedInstanceState);
31 | * //
32 | * // if (!mShowsDialog) {
33 | * // return;
34 | * // }
35 | * //
36 | * // View view = getView();
37 | * // if (view != null) {
38 | * // if (view.getParent() != null) {
39 | * // throw new IllegalStateException(
40 | * // "DialogFragment can not be attached to a container view");
41 | * // }
42 | * // mDialog.setContentView(view);
43 | * // }
44 | * // }
45 | * 3.对应使用Dialog不同部分包括
46 | * a.xml布局
47 | * b.宽高
48 | * c.位置
49 | * d.背景色
50 | * e.透明度
51 | * f.是否可以点击空白处隐藏
52 | * 控制方法在onStart处理,
53 | * 4.暴露方法:界面中控件处理和点击事件处理
54 | * 5.监听回调,很多弹窗需要输入信息,然后将输入的信息通过回调的方法返回
55 | * 6.当设备Configure属性变化时,数据保存和恢复处理
56 | **/
57 | public abstract class BaseDialogFragment extends DialogFragment {
58 |
59 | public static final String TAG = "TDialog";
60 | private static final float DEFAULT_DIMAMOUNT = 0.2F;
61 |
62 | protected abstract int getLayoutRes();
63 |
64 | protected abstract void bindView(View view);
65 |
66 | protected abstract View getDialogView();
67 |
68 | @NonNull
69 | @Override
70 | public Dialog onCreateDialog(Bundle savedInstanceState) {
71 | return super.onCreateDialog(savedInstanceState);
72 | }
73 |
74 | @Nullable
75 | @Override
76 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
77 | View view = null;
78 | if (getLayoutRes() > 0) {
79 | view = inflater.inflate(getLayoutRes(), container, false);
80 | }
81 | if (getDialogView() != null) {
82 | view = getDialogView();
83 | }
84 | bindView(view);
85 | return view;
86 | }
87 |
88 | @Override
89 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
90 | super.onViewCreated(view, savedInstanceState);
91 | //去除Dialog默认头部
92 | Dialog dialog = getDialog();
93 | dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
94 | dialog.setCanceledOnTouchOutside(isCancelableOutside());
95 | if (dialog.getWindow() != null && getDialogAnimationRes() > 0) {
96 | dialog.getWindow().setWindowAnimations(getDialogAnimationRes());
97 | }
98 | if (getOnKeyListener() !=null){
99 | dialog.setOnKeyListener(getOnKeyListener());
100 | }
101 | }
102 |
103 | protected DialogInterface.OnKeyListener getOnKeyListener() {
104 | return null;
105 | }
106 |
107 | @Override
108 | public void onStart() {
109 | super.onStart();
110 | Window window = getDialog().getWindow();
111 | if (window != null) {
112 | //设置窗体背景色透明
113 | window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
114 | //设置宽高
115 | WindowManager.LayoutParams layoutParams = window.getAttributes();
116 | if (getDialogWidth() > 0) {
117 | layoutParams.width = getDialogWidth();
118 | } else {
119 | layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
120 | }
121 | if (getDialogHeight() > 0) {
122 | layoutParams.height = getDialogHeight();
123 | } else {
124 | layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
125 | }
126 | //透明度
127 | layoutParams.dimAmount = getDimAmount();
128 | //位置
129 | layoutParams.gravity = getGravity();
130 | window.setAttributes(layoutParams);
131 | }
132 | }
133 |
134 | //默认弹窗位置为中心
135 | public int getGravity() {
136 | return Gravity.CENTER;
137 | }
138 |
139 | //默认宽高为包裹内容
140 | public int getDialogHeight() {
141 | return WindowManager.LayoutParams.WRAP_CONTENT;
142 | }
143 |
144 | public int getDialogWidth() {
145 | return WindowManager.LayoutParams.WRAP_CONTENT;
146 | }
147 |
148 | //默认透明度为0.2
149 | public float getDimAmount() {
150 | return DEFAULT_DIMAMOUNT;
151 | }
152 |
153 | public String getFragmentTag() {
154 | return TAG;
155 | }
156 |
157 | public void show(FragmentManager fragmentManager) {
158 | show(fragmentManager, getFragmentTag());
159 | }
160 |
161 | protected boolean isCancelableOutside() {
162 | return true;
163 | }
164 |
165 | //获取弹窗显示动画,子类实现
166 | protected int getDialogAnimationRes() {
167 | return 0;
168 | }
169 |
170 | //获取设备屏幕宽度
171 | public static final int getScreenWidth(Context context) {
172 | return context.getResources().getDisplayMetrics().widthPixels;
173 | }
174 |
175 | //获取设备屏幕高度
176 | public static final int getScreenHeight(Context context) {
177 | return context.getResources().getDisplayMetrics().heightPixels;
178 | }
179 | }
180 |
--------------------------------------------------------------------------------
/tdialog/src/main/java/com/timmy/tdialog/base/BindViewHolder.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog.base;
2 |
3 | import android.graphics.Bitmap;
4 | import android.graphics.Paint;
5 | import android.graphics.Typeface;
6 | import android.graphics.drawable.Drawable;
7 | import android.os.Build;
8 | import android.support.annotation.ColorInt;
9 | import android.support.annotation.DrawableRes;
10 | import android.support.annotation.IdRes;
11 | import android.support.annotation.StringRes;
12 | import android.support.v7.widget.RecyclerView;
13 | import android.text.util.Linkify;
14 | import android.util.SparseArray;
15 | import android.view.View;
16 | import android.view.animation.AlphaAnimation;
17 | import android.widget.Adapter;
18 | import android.widget.AdapterView;
19 | import android.widget.Checkable;
20 | import android.widget.CompoundButton;
21 | import android.widget.ImageView;
22 | import android.widget.ProgressBar;
23 | import android.widget.RatingBar;
24 | import android.widget.TextView;
25 |
26 | import com.timmy.tdialog.TDialog;
27 |
28 | /**
29 | * 借鉴RecyclerView.Adapter的ViewHolder写法
30 | * 将Dialog的根布局传入,主要处理点击方法
31 | *
32 | * @author Timmy
33 | * @time 2017/12/28 16:18
34 | **/
35 | public class BindViewHolder extends RecyclerView.ViewHolder {
36 |
37 | public View bindView;
38 | private SparseArray views;
39 | private TDialog dialog;
40 |
41 | public BindViewHolder(final View view) {
42 | super(view);
43 | this.bindView = view;
44 | this.views = new SparseArray<>();
45 | }
46 |
47 | public BindViewHolder(View view, TDialog dialog) {
48 | super(view);
49 | this.bindView = view;
50 | this.dialog = dialog;
51 | views = new SparseArray<>();
52 | }
53 |
54 | public T getView(@IdRes int viewId) {
55 | View view = views.get(viewId);
56 | if (view == null) {
57 | view = bindView.findViewById(viewId);
58 | views.put(viewId, view);
59 | }
60 | return (T) view;
61 | }
62 |
63 | public BindViewHolder addOnClickListener(@IdRes final int viewId) {
64 | final View view = getView(viewId);
65 | if (view != null) {
66 | if (!view.isClickable()) {
67 | view.setClickable(true);
68 | }
69 | view.setOnClickListener(new View.OnClickListener() {
70 | @Override
71 | public void onClick(View v) {
72 | if (dialog.getOnViewClickListener() != null) {
73 | dialog.getOnViewClickListener().onViewClick(BindViewHolder.this,view, dialog);
74 | }
75 | }
76 | });
77 | }
78 | return this;
79 | }
80 |
81 | public BindViewHolder setText(@IdRes int viewId, CharSequence value) {
82 | TextView view = getView(viewId);
83 | view.setText(value);
84 | return this;
85 | }
86 |
87 | public BindViewHolder setText(@IdRes int viewId, @StringRes int strId) {
88 | TextView view = getView(viewId);
89 | view.setText(strId);
90 | return this;
91 | }
92 |
93 | /**
94 | * Will set the image of an ImageView from a resource id.
95 | *
96 | * @param viewId The view id.
97 | * @param imageResId The image resource id.
98 | * @return The BaseViewHolder for chaining.
99 | */
100 | public BindViewHolder setImageResource(@IdRes int viewId, @DrawableRes int imageResId) {
101 | ImageView view = getView(viewId);
102 | view.setImageResource(imageResId);
103 | return this;
104 | }
105 |
106 | /**
107 | * Will set background color of a view.
108 | *
109 | * @param viewId The view id.
110 | * @param color A color, not a resource id.
111 | * @return The BindViewHolder for chaining.
112 | */
113 | public BindViewHolder setBackgroundColor(@IdRes int viewId, @ColorInt int color) {
114 | View view = getView(viewId);
115 | view.setBackgroundColor(color);
116 | return this;
117 | }
118 | /**
119 | * Will set background of a view.
120 | *
121 | * @param viewId The view id.
122 | * @param backgroundRes A resource to use as a background.
123 | * @return The BindViewHolder for chaining.
124 | */
125 | public BindViewHolder setBackgroundRes(@IdRes int viewId, @DrawableRes int backgroundRes) {
126 | View view = getView(viewId);
127 | view.setBackgroundResource(backgroundRes);
128 | return this;
129 | }
130 |
131 | /**
132 | * Will set text color of a TextView.
133 | *
134 | * @param viewId The view id.
135 | * @param textColor The text color (not a resource id).
136 | * @return The BindViewHolder for chaining.
137 | */
138 | public BindViewHolder setTextColor(@IdRes int viewId, @ColorInt int textColor) {
139 | TextView view = getView(viewId);
140 | view.setTextColor(textColor);
141 | return this;
142 | }
143 |
144 |
145 | /**
146 | * Will set the image of an ImageView from a drawable.
147 | *
148 | * @param viewId The view id.
149 | * @param drawable The image drawable.
150 | * @return The BindViewHolder for chaining.
151 | */
152 | public BindViewHolder setImageDrawable(@IdRes int viewId, Drawable drawable) {
153 | ImageView view = getView(viewId);
154 | view.setImageDrawable(drawable);
155 | return this;
156 | }
157 |
158 | /**
159 | * Add an action to set the image of an image view. Can be called multiple times.
160 | */
161 | public BindViewHolder setImageBitmap(@IdRes int viewId, Bitmap bitmap) {
162 | ImageView view = getView(viewId);
163 | view.setImageBitmap(bitmap);
164 | return this;
165 | }
166 |
167 | /**
168 | * Add an action to set the alpha of a view. Can be called multiple times.
169 | * Alpha between 0-1.
170 | */
171 | public BindViewHolder setAlpha(@IdRes int viewId, float value) {
172 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
173 | getView(viewId).setAlpha(value);
174 | } else {
175 | // Pre-honeycomb hack to set Alpha value
176 | AlphaAnimation alpha = new AlphaAnimation(value, value);
177 | alpha.setDuration(0);
178 | alpha.setFillAfter(true);
179 | getView(viewId).startAnimation(alpha);
180 | }
181 | return this;
182 | }
183 |
184 | /**
185 | * Set a view visibility to VISIBLE (true) or GONE (false).
186 | *
187 | * @param viewId The view id.
188 | * @param visible True for VISIBLE, false for GONE.
189 | * @return The BindViewHolder for chaining.
190 | */
191 | public BindViewHolder setGone(@IdRes int viewId, boolean visible) {
192 | View view = getView(viewId);
193 | view.setVisibility(visible ? View.VISIBLE : View.GONE);
194 | return this;
195 | }
196 |
197 | /**
198 | * Set a view visibility to VISIBLE (true) or INVISIBLE (false).
199 | *
200 | * @param viewId The view id.
201 | * @param visible True for VISIBLE, false for INVISIBLE.
202 | * @return The BindViewHolder for chaining.
203 | */
204 | public BindViewHolder setVisible(@IdRes int viewId, boolean visible) {
205 | View view = getView(viewId);
206 | view.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
207 | return this;
208 | }
209 |
210 | public BindViewHolder setVisibility(@IdRes int viewId, int visible) {
211 | getView(viewId).setVisibility(visible);
212 | return this;
213 | }
214 |
215 | /**
216 | * Add links into a TextView.
217 | *
218 | * @param viewId The id of the TextView to linkify.
219 | * @return The BindViewHolder for chaining.
220 | */
221 | public BindViewHolder linkify(@IdRes int viewId) {
222 | TextView view = getView(viewId);
223 | Linkify.addLinks(view, Linkify.ALL);
224 | return this;
225 | }
226 |
227 | /**
228 | * Apply the typeface to the given viewId, and enable subpixel rendering.
229 | */
230 | public BindViewHolder setTypeface(@IdRes int viewId, Typeface typeface) {
231 | TextView view = getView(viewId);
232 | view.setTypeface(typeface);
233 | view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
234 | return this;
235 | }
236 |
237 | /**
238 | * Apply the typeface to all the given viewIds, and enable subpixel rendering.
239 | */
240 | public BindViewHolder setTypeface(Typeface typeface, int... viewIds) {
241 | for (int viewId : viewIds) {
242 | TextView view = getView(viewId);
243 | view.setTypeface(typeface);
244 | view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
245 | }
246 | return this;
247 | }
248 |
249 | /**
250 | * Sets the progress of a ProgressBar.
251 | *
252 | * @param viewId The view id.
253 | * @param progress The progress.
254 | * @return The BindViewHolder for chaining.
255 | */
256 | public BindViewHolder setProgress(@IdRes int viewId, int progress) {
257 | ProgressBar view = getView(viewId);
258 | view.setProgress(progress);
259 | return this;
260 | }
261 |
262 | /**
263 | * Sets the progress and max of a ProgressBar.
264 | *
265 | * @param viewId The view id.
266 | * @param progress The progress.
267 | * @param max The max value of a ProgressBar.
268 | * @return The BindViewHolder for chaining.
269 | */
270 | public BindViewHolder setProgress(@IdRes int viewId, int progress, int max) {
271 | ProgressBar view = getView(viewId);
272 | view.setMax(max);
273 | view.setProgress(progress);
274 | return this;
275 | }
276 |
277 | /**
278 | * Sets the range of a ProgressBar to 0...max.
279 | *
280 | * @param viewId The view id.
281 | * @param max The max value of a ProgressBar.
282 | * @return The BindViewHolder for chaining.
283 | */
284 | public BindViewHolder setMax(@IdRes int viewId, int max) {
285 | ProgressBar view = getView(viewId);
286 | view.setMax(max);
287 | return this;
288 | }
289 |
290 | /**
291 | * Sets the rating (the number of stars filled) of a RatingBar.
292 | *
293 | * @param viewId The view id.
294 | * @param rating The rating.
295 | * @return The BindViewHolder for chaining.
296 | */
297 | public BindViewHolder setRating(@IdRes int viewId, float rating) {
298 | RatingBar view = getView(viewId);
299 | view.setRating(rating);
300 | return this;
301 | }
302 |
303 | /**
304 | * Sets the rating (the number of stars filled) and max of a RatingBar.
305 | *
306 | * @param viewId The view id.
307 | * @param rating The rating.
308 | * @param max The range of the RatingBar to 0...max.
309 | * @return The BindViewHolder for chaining.
310 | */
311 | public BindViewHolder setRating(@IdRes int viewId, float rating, int max) {
312 | RatingBar view = getView(viewId);
313 | view.setMax(max);
314 | view.setRating(rating);
315 | return this;
316 | }
317 |
318 | /**
319 | * Sets the on click listener of the view.
320 | *
321 | * @param viewId The view id.
322 | * @param listener The on click listener;
323 | * @return The BindViewHolder for chaining.
324 | */
325 | @Deprecated
326 | public BindViewHolder setOnClickListener(@IdRes int viewId, View.OnClickListener listener) {
327 | View view = getView(viewId);
328 | view.setOnClickListener(listener);
329 | return this;
330 | }
331 |
332 | /**
333 | * Sets the on touch listener of the view.
334 | *
335 | * @param viewId The view id.
336 | * @param listener The on touch listener;
337 | * @return The BindViewHolder for chaining.
338 | */
339 | @Deprecated
340 | public BindViewHolder setOnTouchListener(@IdRes int viewId, View.OnTouchListener listener) {
341 | View view = getView(viewId);
342 | view.setOnTouchListener(listener);
343 | return this;
344 | }
345 |
346 | /**
347 | * Sets the on long click listener of the view.
348 | *
349 | * @param viewId The view id.
350 | * @param listener The on long click listener;
351 | * @return The BindViewHolder for chaining.
352 | */
353 | @Deprecated
354 | public BindViewHolder setOnLongClickListener(@IdRes int viewId, View.OnLongClickListener listener) {
355 | View view = getView(viewId);
356 | view.setOnLongClickListener(listener);
357 | return this;
358 | }
359 |
360 | /**
361 | * Sets the listview or gridview's item click listener of the view
362 | *
363 | * @param viewId The view id.
364 | * @param listener The item on click listener;
365 | * @return The BindViewHolder for chaining.
366 | * Please use {@link #addOnClickListener(int)} (int)} (adapter.setOnItemChildClickListener(listener))}
367 | */
368 | @Deprecated
369 | public BindViewHolder setOnItemClickListener(@IdRes int viewId, AdapterView.OnItemClickListener listener) {
370 | AdapterView view = getView(viewId);
371 | view.setOnItemClickListener(listener);
372 | return this;
373 | }
374 |
375 | /**
376 | * Sets the listview or gridview's item long click listener of the view
377 | *
378 | * @param viewId The view id.
379 | * @param listener The item long click listener;
380 | * @return The BindViewHolder for chaining.
381 | */
382 | public BindViewHolder setOnItemLongClickListener(@IdRes int viewId, AdapterView.OnItemLongClickListener listener) {
383 | AdapterView view = getView(viewId);
384 | view.setOnItemLongClickListener(listener);
385 | return this;
386 | }
387 |
388 | /**
389 | * Sets the listview or gridview's item selected click listener of the view
390 | *
391 | * @param viewId The view id.
392 | * @param listener The item selected click listener;
393 | * @return The BindViewHolder for chaining.
394 | */
395 | public BindViewHolder setOnItemSelectedClickListener(@IdRes int viewId, AdapterView.OnItemSelectedListener listener) {
396 | AdapterView view = getView(viewId);
397 | view.setOnItemSelectedListener(listener);
398 | return this;
399 | }
400 |
401 | /**
402 | * Sets the on checked change listener of the view.
403 | *
404 | * @param viewId The view id.
405 | * @param listener The checked change listener of compound button.
406 | * @return The BindViewHolder for chaining.
407 | */
408 | public BindViewHolder setOnCheckedChangeListener(@IdRes int viewId, CompoundButton.OnCheckedChangeListener listener) {
409 | CompoundButton view = getView(viewId);
410 | view.setOnCheckedChangeListener(listener);
411 | return this;
412 | }
413 |
414 | /**
415 | * Sets the tag of the view.
416 | *
417 | * @param viewId The view id.
418 | * @param tag The tag;
419 | * @return The BindViewHolder for chaining.
420 | */
421 | public BindViewHolder setTag(@IdRes int viewId, Object tag) {
422 | View view = getView(viewId);
423 | view.setTag(tag);
424 | return this;
425 | }
426 |
427 | /**
428 | * Sets the tag of the view.
429 | *
430 | * @param viewId The view id.
431 | * @param key The key of tag;
432 | * @param tag The tag;
433 | * @return The BindViewHolder for chaining.
434 | */
435 | public BindViewHolder setTag(@IdRes int viewId, int key, Object tag) {
436 | View view = getView(viewId);
437 | view.setTag(key, tag);
438 | return this;
439 | }
440 |
441 | /**
442 | * Sets the checked status of a checkable.
443 | *
444 | * @param viewId The view id.
445 | * @param checked The checked status;
446 | * @return The BindViewHolder for chaining.
447 | */
448 | public BindViewHolder setChecked(@IdRes int viewId, boolean checked) {
449 | View view = getView(viewId);
450 | // View unable cast to Checkable
451 | if (view instanceof Checkable) {
452 | ((Checkable) view).setChecked(checked);
453 | }
454 | return this;
455 | }
456 |
457 | /**
458 | * Sets the adapter of a adapter view.
459 | *
460 | * @param viewId The view id.
461 | * @param adapter The adapter;
462 | * @return The BindViewHolder for chaining.
463 | */
464 | @SuppressWarnings("unchecked")
465 | public BindViewHolder setAdapter(@IdRes int viewId, Adapter adapter) {
466 | AdapterView view = getView(viewId);
467 | view.setAdapter(adapter);
468 | return this;
469 | }
470 | }
471 |
--------------------------------------------------------------------------------
/tdialog/src/main/java/com/timmy/tdialog/base/TBaseAdapter.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog.base;
2 |
3 | import android.support.annotation.LayoutRes;
4 | import android.support.v7.widget.RecyclerView;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.view.ViewGroup;
8 |
9 | import com.timmy.tdialog.TDialog;
10 |
11 | import java.util.List;
12 | /**
13 | *
14 | * @author Timmy
15 | * @time 2018/1/24 14:39
16 | * @GitHub https://github.com/Timmy-zzh/TDialog
17 | **/
18 | public abstract class TBaseAdapter extends RecyclerView.Adapter {
19 |
20 | private final int layoutRes;
21 | private List datas;
22 | private OnAdapterItemClickListener adapterItemClickListener;
23 | private TDialog dialog;
24 |
25 | protected abstract void onBind(BindViewHolder holder, int position, T t);
26 |
27 | public TBaseAdapter(@LayoutRes int layoutRes, List datas) {
28 | this.layoutRes = layoutRes;
29 | this.datas = datas;
30 | }
31 |
32 | @Override
33 | public BindViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
34 | return new BindViewHolder(LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false));
35 | }
36 |
37 | @Override
38 | public void onBindViewHolder(final BindViewHolder holder, final int position) {
39 | onBind(holder, position, datas.get(position));
40 | holder.itemView.setOnClickListener(new View.OnClickListener() {
41 | @Override
42 | public void onClick(View v) {
43 | adapterItemClickListener.onItemClick(holder, position, datas.get(position), dialog);
44 | }
45 | });
46 | }
47 |
48 | @Override
49 | public int getItemCount() {
50 | return datas.size();
51 | }
52 |
53 | public void setTDialog(TDialog tDialog) {
54 | this.dialog = tDialog;
55 | }
56 |
57 | public interface OnAdapterItemClickListener {
58 | void onItemClick(BindViewHolder holder, int position, T t, TDialog tDialog);
59 | }
60 |
61 | public void setOnAdapterItemClickListener(OnAdapterItemClickListener listener) {
62 | this.adapterItemClickListener = listener;
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/tdialog/src/main/java/com/timmy/tdialog/base/TController.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog.base;
2 |
3 | import android.content.DialogInterface;
4 | import android.os.Parcel;
5 | import android.os.Parcelable;
6 | import android.support.v4.app.FragmentManager;
7 | import android.support.v7.widget.LinearLayoutManager;
8 | import android.util.Log;
9 | import android.view.Gravity;
10 | import android.view.View;
11 |
12 | import com.timmy.tdialog.R;
13 | import com.timmy.tdialog.listener.OnBindViewListener;
14 | import com.timmy.tdialog.listener.OnViewClickListener;
15 |
16 | import java.io.Serializable;
17 |
18 | /**
19 | * 数据保存封装的容器类
20 | *
21 | * @author Timmy
22 | * @time 2018/1/24 14:40
23 | * @GitHub https://github.com/Timmy-zzh/TDialog
24 | **/
25 | public class TController implements Parcelable, Serializable {
26 |
27 | private FragmentManager fragmentManager;
28 | private int layoutRes;
29 | private int height;
30 | private int width;
31 | private float dimAmount;
32 | private int gravity;
33 | private String tag;
34 | private int[] ids;
35 | private boolean isCancelableOutside;
36 | private OnViewClickListener onViewClickListener;
37 | private OnBindViewListener onBindViewListener;
38 | private A adapter;
39 | private TBaseAdapter.OnAdapterItemClickListener adapterItemClickListener;
40 | private int orientation;
41 | private int dialogAnimationRes;
42 | private View dialogView;
43 | private DialogInterface.OnDismissListener onDismissListener;
44 | private DialogInterface.OnKeyListener onKeyListener;
45 |
46 |
47 | //////////////////////////////////////////Parcelable持久化//////////////////////////////////////////////////////
48 | public TController() {
49 | }
50 |
51 | protected TController(Parcel in) {
52 | layoutRes = in.readInt();
53 | height = in.readInt();
54 | width = in.readInt();
55 | dimAmount = in.readFloat();
56 | gravity = in.readInt();
57 | tag = in.readString();
58 | ids = in.createIntArray();
59 | isCancelableOutside = in.readByte() != 0;
60 | orientation = in.readInt();
61 | }
62 |
63 | public static final Creator CREATOR = new Creator() {
64 | @Override
65 | public TController createFromParcel(Parcel in) {
66 | return new TController(in);
67 | }
68 |
69 | @Override
70 | public TController[] newArray(int size) {
71 | return new TController[size];
72 | }
73 | };
74 |
75 | //内容描述接口,不用管
76 | @Override
77 | public int describeContents() {
78 | return 0;
79 | }
80 |
81 | @Override
82 | public void writeToParcel(Parcel dest, int flags) {
83 | dest.writeInt(layoutRes);
84 | dest.writeInt(height);
85 | dest.writeInt(width);
86 | dest.writeFloat(dimAmount);
87 | dest.writeInt(gravity);
88 | dest.writeString(tag);
89 | dest.writeIntArray(ids);
90 | dest.writeByte((byte) (isCancelableOutside ? 1 : 0));
91 | dest.writeInt(orientation);
92 | }
93 |
94 | ////////////////////////////////////////////////////////////////////////////////////////////////
95 |
96 | //get
97 | public FragmentManager getFragmentManager() {
98 | return fragmentManager;
99 | }
100 |
101 | public int getLayoutRes() {
102 | return layoutRes;
103 | }
104 |
105 | public void setLayoutRes(int layoutRes) {
106 | this.layoutRes = layoutRes;
107 | }
108 |
109 | public int getHeight() {
110 | return height;
111 | }
112 |
113 | public int getWidth() {
114 | return width;
115 | }
116 |
117 | public void setWidth(int mWidth) {
118 | this.width = mWidth;
119 | }
120 |
121 | public float getDimAmount() {
122 | return dimAmount;
123 | }
124 |
125 | public int getGravity() {
126 | return gravity;
127 | }
128 |
129 | public String getTag() {
130 | return tag;
131 | }
132 |
133 | public int[] getIds() {
134 | return ids;
135 | }
136 |
137 | public boolean isCancelableOutside() {
138 | return isCancelableOutside;
139 | }
140 |
141 | public OnViewClickListener getOnViewClickListener() {
142 | return onViewClickListener;
143 | }
144 |
145 | public int getOrientation() {
146 | return orientation;
147 | }
148 |
149 | public OnBindViewListener getOnBindViewListener() {
150 | return onBindViewListener;
151 | }
152 |
153 | public DialogInterface.OnDismissListener getOnDismissListener() {
154 | return onDismissListener;
155 | }
156 |
157 | public DialogInterface.OnKeyListener getOnKeyListener() {
158 | return onKeyListener;
159 | }
160 |
161 | public View getDialogView() {
162 | return dialogView;
163 | }
164 |
165 | //列表
166 | public A getAdapter() {
167 | return adapter;
168 | }
169 |
170 | public void setAdapter(A adapter) {
171 | this.adapter = adapter;
172 | }
173 |
174 | public TBaseAdapter.OnAdapterItemClickListener getAdapterItemClickListener() {
175 | return adapterItemClickListener;
176 | }
177 |
178 | public void setAdapterItemClickListener(TBaseAdapter.OnAdapterItemClickListener adapterItemClickListener) {
179 | this.adapterItemClickListener = adapterItemClickListener;
180 | }
181 |
182 | public int getDialogAnimationRes() {
183 | return dialogAnimationRes;
184 | }
185 |
186 | /**************************************************************************
187 | */
188 | public static class TParams {
189 | public FragmentManager mFragmentManager;
190 | public int mLayoutRes;
191 | public int mWidth;
192 | public int mHeight;
193 | public float mDimAmount = 0.2f;
194 | public int mGravity = Gravity.CENTER;
195 | public String mTag = "TDialog";
196 | public int[] ids;
197 | public boolean mIsCancelableOutside = true;
198 | public OnViewClickListener mOnViewClickListener;
199 | public OnBindViewListener bindViewListener;
200 | public int mDialogAnimationRes = 0;//弹窗动画
201 | //列表
202 | public A adapter;
203 | public TBaseAdapter.OnAdapterItemClickListener adapterItemClickListener;
204 | public int listLayoutRes;
205 | public int orientation = LinearLayoutManager.VERTICAL;//默认RecyclerView的列表方向为垂直方向
206 | public View mDialogView;//直接使用传入进来的View,而不需要通过解析Xml
207 | public DialogInterface.OnDismissListener mOnDismissListener;
208 | public DialogInterface.OnKeyListener mKeyListener;
209 |
210 | public void apply(TController tController) {
211 | tController.fragmentManager = mFragmentManager;
212 | if (mLayoutRes > 0) {
213 | tController.layoutRes = mLayoutRes;
214 | }
215 | if (mDialogView != null) {
216 | tController.dialogView = mDialogView;
217 | }
218 | if (mWidth > 0) {
219 | tController.width = mWidth;
220 | }
221 | if (mHeight > 0) {
222 | tController.height = mHeight;
223 | }
224 | tController.dimAmount = mDimAmount;
225 | tController.gravity = mGravity;
226 | tController.tag = mTag;
227 | if (ids != null) {
228 | tController.ids = ids;
229 | }
230 | tController.isCancelableOutside = mIsCancelableOutside;
231 | tController.onViewClickListener = mOnViewClickListener;
232 | tController.onBindViewListener = bindViewListener;
233 | tController.onDismissListener = mOnDismissListener;
234 | tController.dialogAnimationRes = mDialogAnimationRes;
235 | tController.onKeyListener =mKeyListener;
236 |
237 | if (adapter != null) {
238 | tController.setAdapter(adapter);
239 | if (listLayoutRes <= 0) {//使用默认的布局
240 | tController.setLayoutRes(R.layout.dialog_recycler);
241 | } else {
242 | tController.setLayoutRes(listLayoutRes);
243 | }
244 | tController.orientation = orientation;
245 | } else {
246 | if (tController.getLayoutRes() <= 0 && tController.getDialogView() == null) {
247 | throw new IllegalArgumentException("请先调用setLayoutRes()方法设置弹窗所需的xml布局!");
248 | }
249 | }
250 | if (adapterItemClickListener != null) {
251 | tController.setAdapterItemClickListener(adapterItemClickListener);
252 | }
253 |
254 | //如果宽高都没有设置,则默认给弹窗提供宽度为600
255 | if (tController.width <= 0 && tController.height <= 0) {
256 | tController.width = 600;
257 | }
258 | }
259 | }
260 | }
261 |
--------------------------------------------------------------------------------
/tdialog/src/main/java/com/timmy/tdialog/list/TListDialog.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog.list;
2 |
3 | import android.app.Activity;
4 | import android.content.DialogInterface;
5 | import android.support.annotation.LayoutRes;
6 | import android.support.v4.app.FragmentManager;
7 | import android.support.v7.widget.LinearLayoutManager;
8 | import android.support.v7.widget.RecyclerView;
9 | import android.util.Log;
10 | import android.view.View;
11 |
12 | import com.timmy.tdialog.R;
13 | import com.timmy.tdialog.TDialog;
14 | import com.timmy.tdialog.base.TBaseAdapter;
15 | import com.timmy.tdialog.base.TController;
16 | import com.timmy.tdialog.listener.OnBindViewListener;
17 | import com.timmy.tdialog.listener.OnViewClickListener;
18 |
19 | import java.util.logging.Logger;
20 |
21 | /**
22 | * 列表弹窗 与TDialog实现分开处理
23 | *
24 | * @author Timmy
25 | * @time 2018/1/11 14:38
26 | **/
27 | public class TListDialog extends TDialog {
28 |
29 |
30 | @Override
31 | protected void bindView(View view) {
32 | super.bindView(view);
33 | if (tController.getAdapter() != null) {//有设置列表
34 | //列表
35 | RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
36 | if (recyclerView == null) {
37 | throw new IllegalArgumentException("自定义列表xml布局,请设置RecyclerView的控件id为recycler_view");
38 | }
39 | tController.getAdapter().setTDialog(this);
40 |
41 | RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(view.getContext(),tController.getOrientation(),false);
42 | recyclerView.setLayoutManager(layoutManager);
43 | recyclerView.setAdapter(tController.getAdapter());
44 | tController.getAdapter().notifyDataSetChanged();
45 | if (tController.getAdapterItemClickListener() != null) {
46 | tController.getAdapter().setOnAdapterItemClickListener(tController.getAdapterItemClickListener());
47 | }
48 | }else{
49 | Log.d("TDialog","列表弹窗需要先调用setAdapter()方法!");
50 | }
51 | }
52 |
53 | /*********************************************************************
54 | * 使用Builder模式实现
55 | *
56 | */
57 | public static class Builder {
58 |
59 | TController.TParams params;
60 |
61 | public Builder(FragmentManager fragmentManager) {
62 | params = new TController.TParams();
63 | params.mFragmentManager = fragmentManager;
64 | }
65 |
66 | //各种setXXX()方法设置数据
67 | public TListDialog.Builder setLayoutRes(@LayoutRes int layoutRes) {
68 | params.mLayoutRes = layoutRes;
69 | return this;
70 | }
71 |
72 | //设置自定义列表布局和方向
73 | public TListDialog.Builder setListLayoutRes(@LayoutRes int layoutRes,int orientation) {
74 | params.listLayoutRes = layoutRes;
75 | params.orientation = orientation;
76 | return this;
77 | }
78 |
79 | /**
80 | * 设置弹窗宽度是屏幕宽度的比例 0 -1
81 | */
82 | public TListDialog.Builder setScreenWidthAspect(Activity activity, float widthAspect) {
83 | params.mWidth = (int) (getScreenWidth(activity) * widthAspect);
84 | return this;
85 | }
86 |
87 | public TListDialog.Builder setWidth(int widthPx) {
88 | params.mWidth = widthPx;
89 | return this;
90 | }
91 |
92 | /**
93 | * 设置屏幕高度比例 0 -1
94 | */
95 | public TListDialog.Builder setScreenHeightAspect(Activity activity, float heightAspect) {
96 | params.mHeight = (int) (getScreenHeight(activity) * heightAspect);
97 | return this;
98 | }
99 |
100 | public TListDialog.Builder setHeight(int heightPx) {
101 | params.mHeight = heightPx;
102 | return this;
103 | }
104 |
105 | public TListDialog.Builder setGravity(int gravity) {
106 | params.mGravity = gravity;
107 | return this;
108 | }
109 |
110 | public TListDialog.Builder setCancelOutside(boolean cancel) {
111 | params.mIsCancelableOutside = cancel;
112 | return this;
113 | }
114 |
115 | public TListDialog.Builder setDimAmount(float dim) {
116 | params.mDimAmount = dim;
117 | return this;
118 | }
119 |
120 | public TListDialog.Builder setTag(String tag) {
121 | params.mTag = tag;
122 | return this;
123 | }
124 |
125 | public TListDialog.Builder setOnBindViewListener(OnBindViewListener listener) {
126 | params.bindViewListener = listener;
127 | return this;
128 | }
129 |
130 | public TListDialog.Builder addOnClickListener(int... ids) {
131 | params.ids = ids;
132 | return this;
133 | }
134 |
135 | public TListDialog.Builder setOnViewClickListener(OnViewClickListener listener) {
136 | params.mOnViewClickListener = listener;
137 | return this;
138 | }
139 |
140 | //列表数据,需要传入数据和Adapter,和item点击数据
141 | public TListDialog.Builder setAdapter(A adapter) {
142 | params.adapter = adapter;
143 | return this;
144 | }
145 |
146 | public TListDialog.Builder setOnAdapterItemClickListener(TBaseAdapter.OnAdapterItemClickListener listener) {
147 | params.adapterItemClickListener = listener;
148 | return this;
149 | }
150 |
151 | public TListDialog.Builder setOnDismissListener(DialogInterface.OnDismissListener dismissListener) {
152 | params.mOnDismissListener = dismissListener;
153 | return this;
154 | }
155 |
156 | public TListDialog create() {
157 | TListDialog dialog = new TListDialog();
158 | //将数据从Buidler的DjParams中传递到DjDialog中
159 | params.apply(dialog.tController);
160 | return dialog;
161 | }
162 | }
163 | }
164 |
--------------------------------------------------------------------------------
/tdialog/src/main/java/com/timmy/tdialog/listener/OnBindViewListener.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog.listener;
2 |
3 | import com.timmy.tdialog.base.BindViewHolder;
4 |
5 | public interface OnBindViewListener {
6 | void bindView(BindViewHolder viewHolder);
7 | }
8 |
--------------------------------------------------------------------------------
/tdialog/src/main/java/com/timmy/tdialog/listener/OnViewClickListener.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog.listener;
2 |
3 | import android.view.View;
4 |
5 | import com.timmy.tdialog.TDialog;
6 | import com.timmy.tdialog.base.BindViewHolder;
7 |
8 | public interface OnViewClickListener {
9 | void onViewClick(BindViewHolder viewHolder, View view, TDialog tDialog);
10 | }
11 |
--------------------------------------------------------------------------------
/tdialog/src/main/res/layout/dialog_recycler.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/tdialog/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | tdialog
3 |
4 |
--------------------------------------------------------------------------------
/tdialog/src/test/java/com/timmy/tdialog/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.timmy.tdialog;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() throws Exception {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------