使用DialogFragment创建自定义对话框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用DialogFragment创建自定义对话框相关的知识,希望对你有一定的参考价值。

我发现了几个据说可行的例子,每个都与另一个略有不同,但无论我试图实现哪个,我都得到相同的编译器错误。这是DialogFragment的代码。这里没有问题。

编辑:我发布后,我的代码中实际编写了CustomDialogFragment。那将是一个问题,但实际上并非如此。我道歉。

public class CustomDialogFragment extends DialogFragment

    {
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
                               Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_sample_dialog, container, false);
            getDialog().setTitle("dialog");
            return v;
        }
    }

}

我做了btn static。没有不同。我把代码从onClick移到了onCreate。没有不同。让我的活动扩展FragmentActivity。无论我做什么,我都会在******下面的这行中出现这个错误:

cannot resolve method 'show(android.app.FragmentManager, java.lang.String)'

Activity的代码:

public class CustomDialogActivity extends Activity
{
  Button btn ;
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_sample_dialog);
    btn = new Button(this);
    btn = findViewById(R.id.dismiss);
    btn.setOnClickListener(new View.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        FragmentManager fm = getFragmentManager();
        CustomDialogFragment dialogFragment = new CustomDialogFragment();
        dialogFragment.show(fm, "Sample Fragment"); // **********     
      }
    });
  }
}

我该怎么办?大多数代码来自一个网页或另一个或另一个。你认为我可以让它运行。

如果我从******上面的语句的两边删除Custom,它会编译,但是它不再是我的CustomDialog而且无论如何都没有对话框显示。 (如果我从一侧删除Custom,我会遇到编译错误。转换失败。)

如果我在******的行中使用getSupportFragmentManager()代替fm,则没有错误,但没有弹出对话框。

我显然迷路了。


附:这是build.gradleapp; xml紧随其后,但肯定不是问题所在:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.dslomer64.customdialogactivity"
        minSdkVersion 23
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
           minifyEnabled false
           proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

simple_dialog_fragment.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="match_parent"
    android:gravity="center"
    android:padding="10dp"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/image" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Lorem ipsum dolor sit amet..."
        android:textSize="20dp" />

    <Button
        android:id="@+id/dismiss"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Dismiss" />
</LinearLayout>
答案

首先,您的片段名为MyDialogFragment。你正试图展示CustomDialogFragment。那些不一样。从您问题中的代码片段看,您似乎没有任何名为CustomDialogFragment的内容。

修复后,您需要确保始终使用相同的片段系统。鉴于在Android 9.0+中不推荐使用本机片段,对于新开发,您应该使用库版本的片段。这将涉及:

  • 让你的活动从FragmentActivity延伸或延伸到FragmentActivity的其他东西,例如AppCompatActivity
  • 你的片段从android.support.v4.app.DialogFragment扩展
  • 使用getSupportFragmentManager()

(注意:我在此答案中使用的是Android支持库程序包名称 - 如果您使用的是AndroidX,请使用androidx版本替代)

另一答案

我做了很久以前我应该做的事情:完全阅读并记下关于Dialog coding, with great examples的“一切”知识并寻找提示并在Dialog design do's and dont's做笔记,最后还有很多关于Theming的信息。关于Dialog的问题?去那里。

只有3行可执行的DialogFragment语句有点精简。首先,它没有被覆盖的onCreateDialog方法。把onClick放在Activity并不是一个好主意,因为它提到了一个甚至没有创建的片段,因为它的行动发生在Fragment

正如@Commonsware指出的那样,我应该使用ActivityFragment的支持库版本。

所以,这是活动应该是什么:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class CustomDialogActivity extends AppCompatActivity
{
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_sample_dialog);
    CustomDialogFragment cdf = new CustomDialogFragment();
    cdf.show(getSupportFragmentManager(),"Showing dialog");
  }
}

这是对话框片段。我希望我可以说这是我的所有代码,但我在上面的第一个链接中从一个示例或其他示例获得了所有代码。但有时它只是你做的事情:

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

...

public class CustomDialogFragment extends android.support.v4.app.DialogFragment
{
  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
  {
    View rootView = inflater.inflate(R.layout.fragment_sample_dialog, container,false);
    getDialog().setTitle("Simple Dialog");
    return rootView;
  }

  @Override public Dialog onCreateDialog(Bundle savedInstanceState)
  {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Simple Dialog");
    builder.setMessage("Hey, a dialog!");

    builder.setPositiveButton("Ok", new DialogInterface.OnClickListener()
    {
      @Override public void onClick(DialogInterface dialog, int which)
      {
        Toast.makeText(getContext(), R.string.fire, Toast.LENGTH_LONG).show();
        dismiss();
      }
    });

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
    {
      @Override public void onClick(DialogInterface dialog, int which)
      {
        Toast.makeText(getContext(), R.string.cancel, Toast.LENGTH_LONG).show();
        dismiss();
      }
    });
    return builder.create();
  }
}

以上是关于使用DialogFragment创建自定义对话框的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义DialogFragment问题[重复]

无法动态更改自定义 DialogFragment 布局

Android DialogFragment 不会关闭

DialogFragment 内的 VideoView

自定义DialogFragment中的Tablayout不显示选项卡文本和图标

DialogFragment 泄漏内存