<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大多數中,使用系統內建的dialog並不能滿足UE的設計需要
通常我們只需要關注三個回撥方法:
自定義佈局檔案:隨便寫一個
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/threat_call_rootView" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/dialog_white_big_corner_roundrect_bg"> <LinearLayout android:id="@+id/threat_call_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/dialog_white_big_corner_roundrect_bg" android:orientation="vertical" android:paddingLeft="32dp" android:paddingTop="48dp" android:paddingRight="32dp" android:paddingBottom="48dp"> <TextView android:id="@+id/threat_call_number" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="標題" android:textColor="@color/black" android:textSize="20sp" android:textStyle="bold" /> <TextView android:id="@+id/threat_call_desc" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="4dp" android:lineSpacingExtra="3sp" android:text="正文" android:textColor="@color/black" android:textSize="14sp" /> <EditText android:id="@+id/threat_call_edittext" android:layout_width="match_parent" android:layout_height="48dp" android:layout_marginTop="16dp" android:width="100dp" android:background="@drawable/sip_threat_call_dialog_edittext_stroke"//給editText加個外邊框 android:hint=" (optional)" android:lineSpacingExtra="3sp" android:maxLength="255" android:minLines="1" android:paddingLeft="5dp"//這個屬性的一個妙用可以改變遊標的起始位置,不然遊標有可能看不到 android:text="" android:textCursorDrawable="@null" android:textSize="14sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:id="@+id/threat_call_block_btn" android:layout_width="match_parent" android:layout_height="48dp" android:layout_marginTop="16dp" android:background="@drawable/sip_threat_call_dialog_btn_bg" android:gravity="center" android:text="BLOCK" android:textStyle="bold" /> <Button android:id="@+id/threat_call_cancel_btn" android:layout_width="match_parent" android:layout_height="48dp" android:layout_marginTop="1dp" android:background="@drawable/sip_threat_call_dialog_btn_bg" android:gravity="center" android:text="CANCEL" android:textStyle="bold" /> </LinearLayout> </RelativeLayout>
selfFragment類:
package com.example.hellojni; import android.animation.ObjectAnimator; import android.annotation.SuppressLint; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; public class selfDialogFragment extends DialogFragment { View container; @NonNull @Override public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { return new Dialog(getContext(),R.style.bottom_dialog); // return super.onCreateDialog(savedInstanceState);//不採用系統預設的dialog樣式,自定義dialog主題 } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { Window window = getDialog().getWindow(); window.setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT); window.setGravity(Gravity.CENTER);//設定dialog位置處於中央 if(!iPaid(getContext())){ window.getDecorView().setMinimumWidth(getResources().getDisplayMetrics().widthPixels);//這個設定的目的是為了讓dialog橫向寬度是充滿螢幕的 } // window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);//本來想解決dialog開啟軟鍵盤後,彈窗跟著往上走的效果,效果確實有,不過依然沒有解決我的問題,下面會詳解。 return inflater.inflate(R.layout.dialog_block_reason,container,false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); View dialogViewContent = view.findViewById(R.id.block_number_container); EditText editText = view.findViewById(R.id.optional_block_number); container = view.findViewById(R.id.block_number_container); editText.requestFocus(); InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); dialogViewContent.setOnTouchListener(new View.OnTouchListener() { @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View v, MotionEvent event) { //強制收起軟體盤的方式: InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(),0); return false; } }); view.findViewById(R.id.cancel_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dismissAllowingStateLoss(); hideSoftInputAndDissmissDialog(); } }); private void hideSoftInputAndDissmissDialog() { dismissAllowingStateLoss(); if (getActivity() != null) {//為了解決dialog彈出軟鍵盤退出介面後軟鍵盤依然存在的問題 getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); } } @Override public void onStart() { super.onStart(); } //判斷是否為Pad的方法,通過計算螢幕對角線長度 private boolean isPad(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); DisplayMetrics dm = new DisplayMetrics(); display.getMetrics(dm); double x = Math.pow(dm.widthPixels / dm.xdpi, 2); double y = Math.pow(dm.heightPixels / dm.ydpi, 2); double screenInches = Math.sqrt(x + y); // 螢幕尺寸 return screenInches >= 7.0; } }
<item name="android:windowIsFloating">false</item>
指定為false的話,即便加上了 window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
也不行 效果如下:可以清楚的看到,軟鍵盤還是擋住了兩個按鈕
android:windowIsFloating
設為true時,效果如下:
不過中間多出來的那塊我也不知道受什麼因素影響的,目前這個樣式還能湊活用吧
我這邊用了使用了window.getDecorView().setMinimumWidth(getResources().getDisplayMetrics().widthPixels);
生效了,有的部落格說是使用 window.getDecorView().setPadding(0,0,0,0)
或者主題中有個屬性android:windowFullscree
,不過這兩個我試過都貌似都沒有什麼效果
這個點我使用了getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
解決了,這句話等同於在展示dialog的activity中androidMenifests檔案中設定 andorid:windowSoftInputMode = stateAlwaysHidden
,而僅僅設定成stateHidden是不夠的,具體這兩個引數的詳細區別,官方檔案說的也很含糊,反正我沒讀懂。
我比較認同這篇文章的看法: Android 進入Activity時如何禁止彈出軟鍵盤輸入法
enter動畫:
<?xml version="1.0" encoding="utf-8"?> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromYDelta="100%p" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:toYDelta="50%p" android:duration="200"> </translate>
exit動畫:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" > <scale android:fromXScale="1.0" android:toXScale="0.9" android:fromYScale="1.0" android:toYScale="0.9" android:pivotX="50%" android:pivotY="50%" android:interpolator="@android:anim/decelerate_interpolator" android:duration="150" /> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:interpolator="@android:anim/decelerate_interpolator" android:duration="150"/> </set>
通常只需要關注onCreate
方法,在該方法中,一般需要做如下幾個事情:
setContentView
將自定義的佈局填充到dialog中去在建構函式中設定想要的主題:這裡提供兩種比較常用的主題
<!--對話方塊會在螢幕中間顯示--> <style name="dialog_theme_center_dispay" parent="@android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item><!-- 設定dialog空白背景--> <item name="android:windowIsFloating">true</item> <!-- dialog是否懸浮,當有軟鍵盤的時候會被頂上去--> <item name="android:windowIsTranslucent">false</item> <!-- dialog是否半透明 --> <item name="android:windowMinWidthMinor">100%</item> <!-- dialog橫向寬度充滿整個螢幕 --> <item name="android:windowNoTitle">true</item><!-- dialog是否有標題 --> <item name="android:windowBackground">@color/transparent</item><!-- dialog背景是透明的 --> <item name="android:background">@color/transparent</item> <item name="android:backgroundDimEnabled">true</item> <item name="android:windowSoftInputMode">stateHidden|adjustResize</item> </style> <!--對話方塊會從底部彈出--> <style name="dialog_theme_bottom2top"> <item name="android:windowFrame">@null</item> <item name="android:windowIsFloating">true</item> <item name="android:windowIsTranslucent">false</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@color/transparent</item> <item name="android:backgroundDimEnabled">true</item> <!--是否允許對話方塊的背景變暗:如果允許背景就變暗了。--> <item name="android:windowMinWidthMinor">100%</item><!--寬度鋪滿全螢幕--> <item name="android:windowCloseOnTouchOutside">true</item><!--點選陰影的地方是否可以關閉對話方塊--> <item name="android:windowAnimationStyle">@style/dialog_anim_bottom2top</item><!--對話方塊動畫--> <item name="android:windowSoftInputMode">stateHidden|adjustResize</item> </style> <!--[對話方塊動畫]對話方塊會從底部彈出--> <style name="dialog_anim_bottom2top" parent="@android:style/Animation"> <item name="android:windowEnterAnimation">@anim/bottom_in</item> <item name="android:windowExitAnimation">@anim/bottom_out</item> </style>
bottom_in:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromYDelta="100%p" android:toYDelta="0" /> </set>
bottom_out:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="200" android:fromYDelta="0" android:toYDelta="50%p" /> <alpha android:duration="200" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>
辨別當前裝置是否是平板的方法通常有兩種:
public static boolean isLargeScreen(Context context) { Configuration config = context.getResources().getConfiguration(); int size = config.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK; return (size >= Configuration.SCREENLAYOUT_SIZE_LARGE); }
public static boolean isPad(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); DisplayMetrics dm = new DisplayMetrics(); display.getMetrics(dm); double x = Math.pow(dm.widthPixels / dm.xdpi, 2); double y = Math.pow(dm.heightPixels / dm.ydpi, 2); double screenInches = Math.sqrt(x + y); // 螢幕尺寸 return screenInches >= 7.0; }
到此這篇關於Android自定義Dialog的2種常見方法的文章就介紹到這了,更多相關Android自定義Dialog內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45