Android DialogFragment实战:从基础创建到高级定制

Android Dialog:Dialog和DialogFragment的区别?DialogFragment如何使用?源码解析 Dialog在创建时会关联一个Context(上下文),并通过这个Context获取WindowManager服务,进而与WindowManager绑定,实现窗口的添加和管理。如果onCreateDialog不传递一个新的dialog,那么就会使用默认的,而布局,就是从onCreateView里面取,也就是requireView方法。Dialog是Android中用于显示一个浮动窗口的类,这个窗口会覆盖在当前的活动(Activity)或应用程序的顶部。我们可以看一下Dialog的源码。 阅读详情

1. DialogFragment基础入门:为什么它是Android开发的首选

DialogFragment作为Android官方推荐的对话框解决方案,已经成为了现代Android开发中不可或缺的组件。我在实际项目中使用DialogFragment已经有五年多的时间,从最初的简单提示框到复杂的自定义交互界面,它确实比传统的Dialog类更加灵活和可靠。

DialogFragment本质上是一个特殊的Fragment,专门用于管理和展示对话框。它的最大优势在于完整的生命周期管理,这意味着当屏幕旋转或配置发生变化时,对话框状态会自动保存和恢复,完全不需要开发者手动处理。我记得早期使用Dialog时,经常需要写一大堆代码来处理屏幕旋转导致的崩溃问题,而DialogFragment彻底解决了这个痛点。

另一个重要优势是DialogFragment可以更好地与FragmentManager集成。通过FragmentTransaction来显示对话框,使得对话框的管理更加统一和规范。在实际开发中,我建议所有Android开发者都使用DialogFragment来替代传统的Dialog,特别是对于需要处理复杂交互或者数据持久化的场景。

创建基本的DialogFragment非常简单,首先需要创建一个继承自DialogFragment的子类:

public class BasicDialogFragment extends DialogFragment {
    // 这里实现对话框的具体逻辑
}

然后根据需求重写onCreateView或onCreateDialog方法。这两种方式各有适用场景,接下来我们会详细讨论。

2. 两种核心构建方式:自定义布局与AlertDialog的深度对比

2.1 使用自定义布局构建对话框

当需要高度定制化的UI界面时,使用自定义布局是最佳选择。这种方式通过重写onCreateView方法来实现,给你完全的控制权来设计对话框的视觉效果和交互逻辑。

我在一个电商项目中就大量使用了这种方式。比如商品详情页的规格选择对话框,需要显示复杂的SKU信息和图片,这时候自定义布局就派上了大用场。

public class CustomLayoutDialog extends DialogFragment {
    private EditText inputEditText;
    private CustomDialogListener listener;

    public interface CustomDialogListener {
        void onInputSubmitted(String inputText);
    }

    public void setDialogListener(CustomDialogListener listener) {
        this.listener = listener;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_custom_layout, container, false);
        
        inputEditText = view.findViewById(R.id.input_edittext);
        Button submitButton = view.findViewById(R.id.submit_button);
        Button cancelButton = view.findViewById(R.id.cancel_button);

        submitButton.setOnClickListener(v -> {
            if (listener != null) {
                listener.onInputSubmitted(inputEditText.getText().toString());
            }
            dismiss();
        });

        cancelButton.setOnClickListener(v -> dismiss());
        
        return view;
    }
}

对应的布局文件dialog_custom_layout.xml可以包含任何你需要的视图组件,从简单的文本输入到复杂的列表和图片展示。

2.2 使用AlertDialog快速构建标准对话框

对于简单的确认对话框或提示信息,使用AlertDialog是更高效的选择。这种方式重写onCreateDialog方法,利用AlertDialog.Builder提供的链式调用快速构建对话框。

public class AlertDialogFragment extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("操作确认")
               .setMessage("确定要执行此操作吗?")
               .setPositiveButton("确定", (dialog, which) -> {
                   // 确定按钮点击处理
                   if (getActivity() instanceof MainActivity) {
                       ((MainActivity) getActivity()).onConfirmAction();
                   }
               })
               .setNegativeButton("取消", (dialog, which) -> {
                   // 取消按钮点击处理
                   dialog.dismiss();
               })
               .setNeutralButton("稍后提醒", (dialog, which) -> {
                   // 中性按钮点击处理
                   scheduleReminder();
               });
        
        return builder.create();
    }
}

在实际项目中,我通常会根据这样的标准来选择构建方式:

场景推荐方式理由
简单确认/提示AlertDialog开发快速,代码简洁
复杂表单输入自定义布局完全控制UI和交互
列表选择AlertDialog内置列表样式,开发效率高
自定义动画自定义布局可以完全控制动画效果
全屏对话框自定义布局需要调整窗口参数

3. 完整实战示例:从零构建功能完整的自定义对话框

让我们通过一个完整的例子来展示如何在真实项目中使用DialogFragment。这个示例是一个用户反馈对话框,包含评分、文本输入和提交功能。

首先创建布局文件dialog_feedback.xml:

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="给我们评分"
        android:textSize="18sp"
        android:textStyle="bold"
        android:layout_marginBottom="16dp"/>

    <RatingBar
        android:id="@+id/rating_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:numStars="5"
        android:stepSize="1"
        android:layout_gravity="center"
        android:layout_marginBottom="24dp"/>

    <EditText
        android:id="@+id/feedback_edittext"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:hint="请输入您的反馈意见"
        android:gravity="start"
        android:inputType="textMultiLine"
        android:layout_marginBottom="24dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="end">

        <Button
            android:id="@+id/cancel_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="取消"
            android:layout_marginEnd="8dp"/>

        <Button
            android:id="@+id/submit_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="提交"
            android:textColor="@color/white"
            android:backgroundTint="@color/colorPrimary"/>

    </LinearLayout>
</LinearLayout>

然后实现DialogFragment类:

public class FeedbackDialogFragment extends DialogFragment {
    public interface FeedbackDialogListener {
        void onFeedbackSubmitted(int rating, String feedback);
    }

    private FeedbackDialogListener listener;

    public void setFeedbackDialogListener(FeedbackDialogListener listener) {
        this.listener = listener;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_feedback, container, false);
        
        RatingBar ratingBar = view.findViewById(R.id.rating_bar);
        EditText feedbackEditText = view.findViewById(R.id.feedback_edittext);
        Button cancelButton = view.findViewById(R.id.cancel_button);
        Button submitButton = view.findViewById(R.id.submit_button);

        cancelButton.setOnClickListener(v -> dismiss());

        submitButton.setOnClickListener(v -> {
            int rating = (int) ratingBar.getRating();
            String feedback = feedbackEditText.getText().toString();
            
            if (feedback.trim().isEmpty()) {
                Toast.makeText(getContext(), "请填写反馈内容", Toast.LENGTH_SHORT).show();
                return;
            }
            
            if (listener != null) {
                listener.onFeedbackSubmitted(rating, feedback);
            }
            dismiss();
        });

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        // 设置对话框宽度为屏幕宽度的90%
        Dialog dialog = getDialog();
        if (dialog != null) {
            int width = (int) (getResources().getDisplayMetrics().widthPixels * 0.9);
            int height = WindowManager.LayoutParams.WRAP_CONTENT;
            dialog.getWindow().setLayout(width, height);
        }
    }
}

在Activity中使用这个对话框:

public class MainActivity extends AppCompatActivity implements FeedbackDialogFragment.FeedbackDialogListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button showFeedbackButton = findViewById(R.id.show_feedback_button);
        showFeedbackButton.setOnClickListener(v -> {
            FeedbackDialogFragment dialog = new FeedbackDialogFragment();
            dialog.setFeedbackDialogListener(this);
            dialog.show(getSupportFragmentManager(), "FeedbackDialog");
        });
    }

    @Override
    public void onFeedbackSubmitted(int rating, String feedback) {
        // 处理用户提交的反馈
        Log.d("Feedback", "评分: " + rating + ", 反馈: " + feedback);
        // 这里可以将数据发送到服务器
        sendFeedbackToServer(rating, feedback);
    }

    private void sendFeedbackToServer(int rating, String feedback) {
        // 实现网络请求逻辑
    }
}

这个完整的示例展示了如何在真实场景中使用DialogFragment,包括布局设计、交互处理和数据处理。我在多个商业项目中都使用了类似的模式,效果非常稳定。

4. 高级定制技巧:样式、动画与全屏对话框实战

4.1 自定义对话框样式和主题

通过自定义样式,你可以让对话框完全匹配应用的视觉设计。我在项目中经常需要调整对话框的圆角、背景色和阴影效果。

首先在styles.xml中定义自定义对话框样式:

<style name="CustomDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowBackground">@drawable/dialog_background</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@style/DialogAnimation</item>
</style>

然后在DialogFragment中应用这个样式:

public class StyledDialogFragment extends DialogFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialogTheme);
    }
}

4.2 实现流畅的对话框动画

动画效果可以显著提升用户体验。我通常会在对话框显示和隐藏时添加适当的动画效果。

创建动画资源文件slide_in_bottom.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromYDelta="100%"
        android:toYDelta="0%"/>
    <alpha
        android:duration="@android:integer/config_shortAnimTime"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"/>
</set>

创建slide_out_bottom.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromYDelta="0%"
        android:toYDelta="100%"/>
    <alpha
        android:duration="@android:integer/config_shortAnimTime"
        android:fromAlpha="1.0"
        android:toAlpha="0.0"/>
</set>

在styles.xml中定义动画样式:

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item>
    <item name="android:windowExitAnimation">@anim/slide_out_bottom</item>
</style>

4.3 创建全屏对话框的实现方案

全屏对话框在某些场景下非常有用,比如需要显示大量内容或实现特殊交互时。我在地图应用中就经常使用全屏对话框来展示详细地点信息。

public class FullScreenDialogFragment extends DialogFragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dialog_fullscreen, container, false);
    }

    @Override
    public void onStart() {
        super.onStart();
        
        Dialog dialog = getDialog();
        if (dialog != null) {
            // 设置全屏布局参数
            int width = ViewGroup.LayoutParams.MATCH_PARENT;
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
            dialog.getWindow().setLayout(width, height);
            
            // 设置窗口背景透明,避免出现默认的对话框边框
            dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            
            // 如果需要隐藏状态栏
            dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                                     WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
        // 添加关闭按钮处理
        View closeButton = view.findViewById(R.id.close_button);
        closeButton.setOnClickListener(v -> dismiss());
    }
}

在实际项目中,全屏对话框经常需要处理软键盘弹出时的布局调整。我通常会在onCreateView中添加以下代码:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    
    // 监听布局变化,调整软键盘弹出时的布局
    view.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
        Rect r = new Rect();
        view.getWindowVisibleDisplayFrame(r);
        int screenHeight = view.getRootView().getHeight();
        int keypadHeight = screenHeight - r.bottom;

        if (keypadHeight > screenHeight * 0.15) {
            // 软键盘显示,调整布局
            adjustLayoutForKeyboard(true);
        } else {
            // 软键盘隐藏,恢复布局
            adjustLayoutForKeyboard(false);
        }
    });
}

这些高级定制技巧可以让你的对话框体验更加流畅和专业。我在实际开发中发现,合适的动画效果和视觉设计可以显著提升用户满意度。

5. 生命周期管理与最佳实践:避免常见陷阱

DialogFragment的生命周期管理是其最大的优势,但也需要开发者正确理解和使用。经过多个项目的实践,我总结了一些重要的最佳实践。

5.1 正确处理配置变化

DialogFragment自动处理屏幕旋转等配置变化,但有时我们需要手动保存和恢复一些特殊状态。我通常使用onSaveInstanceState方法来保存临时数据:

public class StatefulDialogFragment extends DialogFragment {
    private static final String KEY_USER_INPUT = "user_input";
    private String userInput;

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(KEY_USER_INPUT, userInput);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            userInput = savedInstanceState.getString(KEY_USER_INPUT);
        }
    }
}

5.2 避免内存泄漏

DialogFragment虽然比Dialog更安全,但仍然需要注意避免内存泄漏。我强烈建议使用弱引用或接口回调的方式来处理与Activity的通信:

public class SafeDialogFragment extends DialogFragment {
    private WeakReference<DialogCallback> callbackRef;

    public interface DialogCallback {
        void onDialogResult(String result);
    }

    public void setDialogCallback(DialogCallback callback) {
        this.callbackRef = new WeakReference<>(callback);
    }

    private void notifyCallback(String result) {
        if (callbackRef != null && callbackRef.get() != null) {
            callbackRef.get().onDialogResult(result);
        }
    }
}

5.3 对话框的显示和隐藏管理

正确管理对话框的显示状态很重要。我建议使用showNow方法而不是show方法,因为showNow会立即执行Fragment事务,避免了一些异步问题:

// 推荐的方式
dialogFragment.showNow(getSupportFragmentManager(), "dialog_tag");

// 或者在需要控制显示时机时使用commitNow
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.add(dialogFragment, "dialog_tag");
transaction.commitNow();

5.4 处理对话框重叠问题

在某些情况下,比如快速点击按钮时,可能会出现对话框重叠的问题。我通常使用以下方法来防止这种情况:

public void showDialog() {
    // 检查是否已经有相同标签的对话框显示
    if (getSupportFragmentManager().findFragmentByTag("dialog_tag") == null) {
        MyDialogFragment dialog = new MyDialogFragment();
        dialog.show(getSupportFragmentManager(), "dialog_tag");
    }
}

5.5 对话框状态恢复的最佳实践

当Activity被重建时,DialogFragment会自动恢复,但有时我们需要确保某些状态正确恢复:

@Override
public void onResume() {
    super.onResume();
    // 检查是否有待恢复的状态
    if (getArguments() != null) {
        String restoredValue = getArguments().getString("key");
        // 恢复UI状态
    }
}

这些最佳实践来自我在实际项目中遇到的真实问题和解决方案。遵循这些建议可以避免很多常见的陷阱,确保对话框在各种情况下都能稳定工作。

6. 实际开发中的疑难问题解决方案

在多年的Android开发中,我遇到了各种DialogFragment相关的疑难问题。这里分享一些最常见的问题和解决方案。

6.1 对话框显示位置不正确的问题

有时候对话框可能不会在期望的位置显示,特别是在全屏对话框或自定义动画的情况下。我使用以下方法确保对话框正确显示:

@Override
public void onStart() {
    super.onStart();
    
    Dialog dialog = getDialog();
    if (dialog != null) {
        Window window = dialog.getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        
        // 设置对话框在底部显示
        params.gravity = Gravity.BOTTOM;
        
        // 设置边距
        params.verticalMargin = 0.1f;
        params.horizontalMargin = 0.1f;
        
        window.setAttributes(params);
        
        // 对于底部对话框,设置适当的动画
        window.setWindowAnimations(R.style.DialogAnimation_Bottom);
    }
}

6.2 软键盘遮挡输入框的问题

这是一个非常常见的问题,特别是在全屏对话框中。我的解决方案是:

private void setupKeyboardHandling(View view) {
    view.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
        Rect r = new Rect();
        view.getWindowVisibleDisplayFrame(r);
        int screenHeight = view.getRootView().getHeight();
        int keypadHeight = screenHeight - r.bottom;

        if (keypadHeight > screenHeight * 0.15) {
            // 软键盘显示,滚动到输入框
            scrollToInputField();
        }
    });
}

6.3 对话框背景变暗的处理

默认情况下对话框背景会变暗,但有时我们需要调整这个效果:

@Override
public void onStart() {
    super.onStart();
    
    Dialog dialog = getDialog();
    if (dialog != null) {
        // 调整背景暗淡程度
        Window window = dialog.getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.dimAmount = 0.5f; // 0-1,1表示完全变黑
        window.setAttributes(params);
        
        // 或者完全移除背景变暗效果
        window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    }
}

6.4 处理对话框之外的点击事件

默认情况下,点击对话框外部会关闭对话框,但有时我们需要禁用这个行为:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    // 方式一:完全禁用外部点击关闭
    setCancelable(false);
    
    // 或者方式二:在代码中动态控制
    // getDialog().setCanceledOnTouchOutside(false);
}

// 如果需要更精细的控制,可以重写onCancel方法
@Override
public void onCancel(DialogInterface dialog) {
    super.onCancel(dialog);
    // 处理取消逻辑,比如显示确认对话框
    showConfirmCancelDialog();
}

这些解决方案都是我在实际项目中经过验证的,能够有效解决常见的DialogFragment使用问题。每个项目的情况可能有所不同,需要根据具体需求进行调整。

记得在实际使用中充分测试各种边界情况,特别是不同Android版本和设备上的表现。DialogFragment虽然强大,但也需要开发者对其工作原理有深入的理解才能发挥最大效用。

Android通用DialogFragment 前言 在开发过程中,我们会经常使用对话框,为了提高开发效率,于是我使用DialogFragment封装了一个通过的对话框。 为什么使用DialogFragment 首先在使用 DialogFragment之前,我们创建对话框一般都会采用Dialog的形式,并且从编写代码的角度来看,Dialog使用起来也较为简单,但Android 官方推荐使用 DialogFragment 来代替 Dialog。 DialogFragment 有着Dialog 所没有的特性在手机配置变化,导致Activity需要重新创建时, 阅读详情

相关推荐

Android高级自定义列表选择Dialog源码解析

在移动应用开发中,对话框(Dialog)是与用户交互的常用组件之一。自定义Dialog允许开发者根据应用需求设计对话框的外观和行为,提供更好的用户体验。自定义Dialog通常涉及创建一个继承自Dialog类或的新类。在实现过程中,开发者可以自定义对话框的布局、样式和行为逻辑。布局自定义:通过XML文件定义对话框的布局,可以包含文本、按钮、图像等多种元素。样式自定义:通过覆盖主题样式,改变对话框的边框、背景色等外观属性。行为逻辑:重写onCreate。

weixin_35045970的博客 746

使用DialogFragment实现自定义视图

要使用 DialogFragment 实现一个自定义的包含自定义视图的对话框,可以创建一个布局文件来定义您想要显示的自定义视图,然后在DialogFragment 中加载该布局文件并显示出来。在需要显示自定义视图对话框的地方(如 Activity 中),通过创建并显示 CustomViewDialogFragment 实例来呈现对话框。首先,创建一个 XML 布局文件(例如 custom_dialog_layout.xml),用于定义自定义的对话框视图。

wolf0706的专栏 850

DialogFragment:Android弹出式对话框设计与实战

本文还有配套的精品资源,点击获取 简介:DialogFragment是Android SDK中用于创建弹出式对话框的组件,它继承自Fragment,结合了对话框和碎片的特性。本课程设计项目经过测试,旨在帮助学生掌握DialogFragment的核心概念、优点、使用方法和常见应用场景。学生将通过实践任务,提升在创建模态对话框、处理屏幕旋转和生命周期管理方面的能力,为未来在An...

weixin_28888459的博客 1467

DialogFragment的使用(自定义Dialog )

做翔翔财富需要自定义Dialog,查了一下发现DialogFragment很合适,貌似也是官方推荐的,而且使用起来相当方便清晰,下面我们来讲讲怎么使用DialogFragment以及我使用的时候遇到的一些问题: 一.先写一个自定义的Dialog布局,布局就是普通的xml,想怎么写就怎么写(注意整体大小),以下使用R.layout.fragment_contact_service_dialog代替

chinben的专栏 4550

Overleaf-Latex-Elsevier-图、表、参考文献标题及引用、伪代码写法(绝对详细直观且易懂)

overleaf爱思唯尔模板踩过的一些坑以及解决办法

2403_87584552的博客 5851

手把手教你用Matlab/Simulink搭建PMSM的SMO无感FOC仿真(附相位补偿与离散化代码)

本文详细介绍了基于滑模观测器(SMO)的永磁同步电机(PMSM)无传感器FOC控制方法,通过Matlab/Simulink平台实现从理论到实践的完整流程。内容涵盖SMO核心原理、离散化处理、转子位置估算与相位补偿技术,以及双闭环控制系统搭建,为工程师提供了一套完整的无传感器控制解决方案。

weixin_27038245的博客 254

Android使用DialogFragment,自定义对话框

Android使用DialogFragment,自定义对话框: 效果图: 当我点击结算时,弹出对话框: 步骤一:创建:pay_dialog_fragment.xml:布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_widt

一条咸鱼 3762

使用electron静默打印

使用electron静默打印 1.使用electron打印的理由 很多情况下程序中使用的打印都是用户无感知的。并且想要灵活的控制打印内容,往往需要借助打印机给我们提供的api再进行开发,这种开发方式非常繁琐,并且开发难度较大。 electron提供的打印api可以非常灵活的控制打印设置的显示,并且可以通过html来书写打印内容。 2.api ele...

w1366352655的博客 945

自定义Dialog和DialogFragment

1.Dialog 系统给的方法基本应用:  http://www.android100.org/html/201302/18/1611.html 2.自定义Dialog,即继承实现任意布局的Dialog (1)可以采用单例模式 public static final CityPickerDialog getInstance(Context context, String cc, Ca

千寻 905

基于陀螺仪航向反馈的轮式机器人PID直线控制

航向角控制是移动机器人实现稳定直线运动的基础技术,其本质是通过实时感知机体朝向偏差并动态调节驱动输出,以抵消机械不对称、轮径误差等固有扰动。该方法依托陀螺仪测量角速度并积分解算航向角,结合离散化PID算法生成补偿性PWM指令,在嵌入式平台(如STM32)上构建低延迟闭环。相比依赖编码器的速度闭环,它规避了轮径标定与安装偏心等误差源,显著提升低成本平台的工程鲁棒性与部署效率。典型应用场景包括教育机器人直线循迹、AGV基础导航模块开发及IMU-PID融合控制原型验证。

web39explorer的博客 1110

鸿蒙读书笔记1:《鸿蒙操作系统设计原理与架构》

GUI、 语 音 控 制 方 式 的 VUI(Voice User Interface, 语 音 用 户 界。电话、多媒体、DFX、MSDP(Multimodal Sensor Data Platform,多。面)、手势/姿态控制的CVUI(Computer Vision User Interface,计算。KAL(Kernel Abstract Layer,内核抽象层)通过屏蔽多内核差异,JavaScript、C、C++等多语言的用户程序开发框架,以及UI框架、

jackyrongvip的专栏 2449

Android 官方推荐 : DialogFragment 创建对话框

1、 概述 DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。 在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。 2、 好处与用法 使用DialogFr

Hongyang 26万+

一文讲透 SAP SD:把报价、订单、交付、开票串成一条可落地的业务闭环

摘要:SAP SD(销售与分销)模块是企业O2C(订单到收款)流程的核心,管理从客户意向到回款的完整链路。该模块围绕销售订单、交付、开票等关键环节,与财务、物料管理等模块深度集成。SD的核心在于主数据管理、单据驱动流程、定价规则引擎和信用风控,通过条件技术实现复杂定价策略,并支持多维度分析。典型应用场景包括多渠道销售企业的价格体系管理、信用控制和物流协同,有效解决销售与交付脱节、财务对账困难等业务痛点。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 513

在Android中创建DialogFragment

Override// 膨胀自定义布局// 初始化视图组件// 处理点击事件dismiss();// 关闭对话框});1. 布局文件 (res/layout/fragment_dialog.xml)

qq_39460057的博客 1390

【自动驾驶轨迹规划之hybrid A*算法】

本文参考论文:https://ai.stanford.edu/~ddolgov/papers/dolgov_gpp_stair08.pdf 这篇文章是基于经典A*算法与reeds-shepp曲线的,不清楚的读者请参考【自动驾驶轨迹规划5之A*算法】_无意2121的博客-优快云博客【自动驾驶轨迹规划之dubins曲线与reeds-shepp曲线】_无意2121的博客-优快云博客 目录 1 hybrid A* 算法创新点 1.1 搜索方式 1.2 车辆运动学模型 1.3 reeds-shepp曲

weixin_65089713的博客 1万+

基于YOLOv11的无人机目标检测系统:实现drone、bird、aircraft多类别识别

采用改进的YOLOv11网络结构,平衡检测精度和速度融合VisDrone和UAVDT数据集,增强模型泛化能力设计多尺度特征融合模块,提升小目标检测性能开发直观的UI界面,便于实际部署和应用。

YOLO 323

Android 弹窗 DialogFragment

前言 一直以来 , 做弹窗功能的时候都是使用的Dialog , 布局复杂的弹窗则使用Activity , 把背景设置成透明, 最近了解到一个DialogFragment , 发现使用起来更加方便, 也是谷歌建议的做法. 简介 DialogFragment 继承自Fragment , 所以它的用法基本跟Fragment一致 , 也包含了一些生命周期和上下文context 和 监听之类的东西. 而且...

卓原的进化之旅 7190

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android使用DialogFragment创建对话框

目录目录 概述 DialogFragment 重写onCreateView来创建Dialog 重写onCreateDialog创建Dialog 与Activity进行通信 参考链接概述DialogFragment是在Android 3.0时引入的,是一种特殊的Fragment,用于在Activity的内容之上展示一个模拟的对话框。例如,用于展示一个警示框、密码框等。在DialogFragment之前

小一的专栏 6018

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android为啥推荐用DialogFragment创建Dialog?

前言:这段时候有点忙,因为再敢需求,说忙也都是在敷衍,时间挤挤还是有的,从开始写博客的那一刻起就应该一直坚持下来,不要三天打鱼两天晒网,上次写过一个Android进阶之(dialog详解一),今天继续上次的内容探究一下,从Android3.0后Android引入的DailogFragment,我们一起从源码的角度去看看为啥谷歌推荐这样创建Dialog. DialogFragment对话框出现的意义

vv_bug 6742

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android_基础_dialogFragment

转载自:http://blog.youkuaiyun.com/lmj623565791/article/details/37815413 1、 概述 DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。 在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。 2、 好处与用法 使用Dia.

写bug的蚊子的博客 2426

Android之DialogFragment

DialogFragment是基于Fragment展示Dialog的窗口。对话框的控制(何时隐藏、显示、关闭)通过对应的Dialogment 的API来完成,而不是Dialog的API.          DialogFragment需要保证Fragment和Dialog的状态保持一致。它监听dialog的dissmiss event,并且去处理自己的状态。这意味着应该调用 show(Fra

行云间 1265

Fragment里面创建DialogFragment对话框

                                                            AUF法则下的对话框   【楔子】  在Actiity页面上做DiaLog似乎非常简单,大部分在学习了控件以后都会使用,但是google希望开发者只使用FragementDialog,刚开始不理解,后来发现碎片对话框真的太好用了,完全就是自我定制,其实就是设计一个xml布...

u012763405的博客 3522

Android底部弹窗实战:从DialogFragment到BottomSheetDialog的进阶指南

本文详细对比了Android底部弹窗的多种实现方式,重点解析了DialogFragment和BottomSheetDialog的实战应用与优势。BottomSheetDialog基于Material Design,提供开箱即用的手势交互和状态管理,是开发复杂底部弹窗的首选方案。文章还提供了全屏适配、动画优化及常见问题解决方案,助力开发者提升用户体验与开发效率。

rice5的博客 983

Android中DialogFragment的使用

一.概述: DialogFragment是Android3.0(API 11)才出现的,它不像以前版本中生成AlertDialog一样,通过AlertDialog.Builder生成Dialog,而是在fragment中弹出Dialog的窗口,即DialogFragment是一个Fragment,而且这个fragment本身就含有一个Dialog对象。 二.创建DialogFragment:

FightFightFight的博客 1778
上一篇: 从连接器视角看FMC+:如何通过物理接口革新提升FPGA系统带宽与兼容性
下一篇: 智能车心脏的脉搏:DRV8701的PWM控制与电机驱动艺术
ruby5
博客等级 码龄15年 29粉丝 893原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值