日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Dialog加载Fragment(DialogFragment)带横竖屏动画

發布時間:2024/3/24 Android 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Dialog加载Fragment(DialogFragment)带横竖屏动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

零 效果圖

???????????????????????????????????????????????????????

?

?

?

一 使用DialogFragment注意事項。

  • Dialog不可加載Fragment,因為使用的是Activity的FragmentManager,所以是找不到Dialog布局中的Fragment的id。
  • 如果想用Dialog加載Fragment,則可以使用新的組件DialogFragment。
  • DialogFragment,則可以認知為是Fragment和Dialog的結合體,有雙方的特性。
  • DialogFragment,其中Fragment特性,可以使用其getChildFragmentManager()特性加載Fragment。
  • DialogFragment,其中Dialog特性,可以使用getDialog().hide();getDialog().show();控制其顯示特性。
  • 調用DialogFragment.dismiss會銷毀所有對象(包括Fragment和dialog),再次調用DialogFragment.show會重新走生命周期。
  • 僅僅調用getDialog().hide();getDialog().show();,不會重新走DialogFragment的生命周期,所以可以讓彈框保留之前的操作數據。
  • 二 自定義一個參考示例

    1.調用代碼

    PreviewDeviceDialog previewDeviceDialog;if (previewDeviceDialog == null) {previewDeviceDialog = new PreviewDeviceDialog();}//由于不想Dialog內容被銷毀,所以重寫show和dismiss previewDeviceDialog.show(getSupportFragmentManager(), getRequestedOrientation());

    2.DialogFragment自定義

    • 豎屏,從底部向上彈出彈框(帶動畫)
    • 橫屏,從右側往左側彈出彈框(帶動畫)
    • 其中的Fragment子頁面,引入自己的子頁面就可以了
    package com.vss.ui.dialog;import android.content.DialogInterface; import android.content.pm.ActivityInfo; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.TextView;import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager;import com.orhanobut.logger.Logger; import com.vss.R; import com.vss.fragment.device.DeviceFragment; import com.vss.listener.DeviceFragmentListener;/*** 設備選擇彈框** 使用DialogFragment* DialogFragment可以加載Fragment* PopupWindow不可以加載Fragment*/ public class PreviewDeviceDialog extends DialogFragment implements View.OnClickListener {private DeviceFragment deviceFragment;private int orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; //默認豎屏@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);Logger.d("---------------" + 3);//設置對話框的風格和各種屬性setCancelable(true);//setStyle();}@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {//設置布局相關getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); //不顯示彈框title//設置默認布局位置Window window = this.getDialog().getWindow();window.getDecorView().setPadding(0, 0, 0, 0); //去掉dialog默認的paddingwindow.setBackgroundDrawable(new ColorDrawable());//layoutView view = inflater.inflate(R.layout.dialog_preview_device, container, false);view.findViewById(R.id.tv_back).setOnClickListener(this);view.findViewById(R.id.tv_confirm).setOnClickListener(this);Logger.d("---------------" + 4);initData();return view;}public void initData() {//加載子FragmentdeviceFragment = new DeviceFragment("", new DeviceFragmentListener() {@Overridepublic void setTitle(String title) {//wsToolbarTitle.setText(title);}@Overridepublic void backLast() {dismiss();}});getChildFragmentManager().beginTransaction().replace(R.id.container, deviceFragment, "Sub").commit();}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.tv_back:deviceFragment.onBackPressed();break;case R.id.tv_confirm:break;}}@Overridepublic void onResume() {super.onResume();//必須在onResume時候重繪高度和動畫才可以實現效果Logger.d("---------------" + 5);if (orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { //豎屏Window window = this.getDialog().getWindow();WindowManager.LayoutParams lp = window.getAttributes();lp.width = WindowManager.LayoutParams.MATCH_PARENT;int screenHeight = getResources().getDisplayMetrics().heightPixels;lp.height = Math.round(screenHeight * 2 / 3);lp.gravity = Gravity.BOTTOM; //設置dialog的位置在底部lp.windowAnimations = R.style.AnimDownToTop; //設置底部動畫window.setAttributes(lp);} else {//橫屏Window window = this.getDialog().getWindow();WindowManager.LayoutParams lp = window.getAttributes();int screenWidth = getResources().getDisplayMetrics().widthPixels;lp.width = Math.round(screenWidth / 2);lp.height = WindowManager.LayoutParams.MATCH_PARENT;lp.gravity = Gravity.RIGHT; //設置dialog的位置在底部lp.windowAnimations = R.style.AnimRightToLeft; //設置右側動畫window.setAttributes(lp);}}public void show(FragmentManager fragmentManager, int orientation) {if(this.orientation == orientation) { //相同方向,重新打開,直接展示彈框(getDialog().show()),不重走生命周期(show)if(this.isAdded()) {getDialog().show(); //如果是顯示,則說明目前狀態是hide,直接顯示} else {show(fragmentManager, "DeviceSelect");}} else { //不同方向,則重新走生命周期//設置新方向this.orientation = orientation;//調用dismiss后,再次調用show生命周期會重新走一遍dismiss();}}//直接調用onDismiss,整個彈框會被銷毀,再次調用show會重新走生命周期@Overridepublic void onDismiss(@NonNull DialogInterface dialog) {//僅調用hide,不銷毀,僅隱藏getDialog().hide();} }

    三 布局

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:background="@color/bg_page"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/bg_page_white"><TextViewandroid:id="@+id/tv_back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="返回"android:textSize="14sp"android:textColor="@color/text_title"android:layout_centerVertical="true"android:padding="10dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="選擇設備"android:textSize="16sp"android:textColor="@color/text_title"android:layout_centerInParent="true"android:padding="10dp"/><TextViewandroid:id="@+id/tv_confirm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="確定"android:textSize="14sp"android:textColor="@color/text_title_yellow"android:layout_centerVertical="true"android:layout_alignParentRight="true"android:padding="10dp"/></RelativeLayout><FrameLayoutandroid:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1" /> </LinearLayout>

    四 動畫styles.xml

    <!-- 彈框動畫 - 底部開始,往上彈出 --><style name="AnimDownToTop" parent="@android:style/Animation"><item name="android:windowEnterAnimation">@anim/anim_bottom_to_top_in</item><item name="android:windowExitAnimation">@anim/anim_bottom_to_top_out</item></style><!-- 彈框動畫 - 右側往左側彈出,左側往右側消失 --><style name="AnimRightToLeft" parent="@android:style/Animation"><item name="android:windowEnterAnimation">@anim/anim_right_to_left_in</item><item name="android:windowExitAnimation">@anim/anim_right_to_left_out</item></style>

    五 動畫資源文件

    anim_right_to_left_in.xml

    <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"><!-- y的起始值,從1000%跑到0 --><translateandroid:duration="300"android:fromYDelta="100%p"android:toYDelta="0" /><alphaandroid:duration="300"android:fromAlpha="0.0"android:toAlpha="1.0" /> </set>

    anim_right_to_left_out.xml

    <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"><!-- y的起始值,從0跑到100% --><translateandroid:duration="50"android:fromXDelta="0"android:toXDelta="100%p" /><alphaandroid:duration="300"android:fromAlpha="1.0"android:toAlpha="0.0" /> </set>

    anim_bottom_to_top_in.xml

    <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"><!-- y的起始值,從1000%跑到0 --><translateandroid:duration="300"android:fromYDelta="100%p"android:toYDelta="0" /><alphaandroid:duration="300"android:fromAlpha="0.0"android:toAlpha="1.0" /> </set>

    anim_bottom_to_top_out.xml

    <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"><!-- y的起始值,從0跑到100% --><translateandroid:duration="50"android:fromYDelta="0"android:toYDelta="100%p" /><alphaandroid:duration="300"android:fromAlpha="1.0"android:toAlpha="0.0" /> </set>

    六 伸手黨可直接用,但是盡量自己調試。

    總結

    以上是生活随笔為你收集整理的Android Dialog加载Fragment(DialogFragment)带横竖屏动画的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。