Android 使用DialogFragment创建自定义对话框

Android 使用DialogFragment创建自定义对话框,android,dialog,android-dialogfragment,Android,Dialog,Android Dialogfragment,我发现了几个假定可以工作的示例,每个示例都有点不同,但是无论我尝试实现哪个示例,都会得到相同的编译器错误。下面是对话框片段的代码。这里没有问题报告 编辑:在我发布之后,我实际上已经在我的代码中编码了自定义对话框片段。这可能是个问题,但事实并非如此。我道歉 public类自定义DialogFragment扩展DialogFragment { @Override public View onCreateView(LayoutInflater inflater, Vie

我发现了几个假定可以工作的示例,每个示例都有点不同,但是无论我尝试实现哪个示例,都会得到相同的编译器错误。下面是
对话框片段的代码。这里没有问题报告

编辑:在我发布之后,我实际上已经在我的代码中编码了自定义对话框片段。这可能是个问题,但事实并非如此。我道歉

public类
自定义
DialogFragment扩展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
静态
。没有区别。我已将代码从
onClick
移动到
onCreate
。没有区别。使我的活动扩展
FragmentActivity
。无论我做什么,我都会在下面的******行中得到此错误:

无法解析方法“show(android.app.FragmentManager,java.lang.String)”

活动的代码

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
,也不会显示任何对话框。(如果仅从一侧删除
自定义
,则会出现编译器错误。强制转换失败。)

如果我使用
getSupportFragmentManager()
代替与*******的行中的
fm
,则不会出现错误,但不会弹出对话框

我显然迷路了


这里是
应用程序的
构建.gradle
<代码>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'
}
简单对话框\u 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版本)

我做了很久以前就应该做的事情:通读并记下“需要了解的一切”,并寻找提示和记录,最后还有很多关于主题的信息。有关
对话框的问题
?去那里

只有3行可执行的
DialogFragment
语句有点贫乏。首先,它没有被重写的
onCreateDialog
方法。将
onClick
放在
活动中并不是一个好主意,因为它引用了一个甚至还没有创建的片段,而且动作发生在
片段中

正如@commonware所指出的,我应该使用
Activity
Fragment
的支持库版本

因此,以下是该活动的内容:

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();
  }
}

您创建了一个名为MyDialogFragment的类,nit customDialogFragment因此使用MyDialogFragment。这一点很好@shubhamgarg1,但正如我的编辑所指出的,我正在处理的代码实际上有一个名为customDialogFragment的类,而不是MyDialogFragment。所以,是的,关于错误的类名,你是绝对正确的,但这不是我遇到的问题。对不起,啊,伙计。。。对但是正如我的编辑和注释所示,我在提交时的代码中没有类名和对象名不匹配的错误。我更改了DialogFragment名称,因为任何以“My”开头的对象都有点幼稚。所以这不是我遇到的问题。假设我也有同样的问题,也许我应该在实施你的建议后以新的思路提交问题。。也许我应该删除这个问题,因为现在它只是愚蠢的。我敢要求用编辑过的正确类定义再看一眼吗?@DSlomer64:很可能“我在这一行上得到了这个错误”的问题是您有一组不匹配的片段实现。在你的问题中,这之后的一切都是非常模糊的,而且我们也没有代码。我不能告诉你是否要删除这个问题。我唯一的建议是,如果你问了一个新问题,你应该提供完整的未经编辑的源代码,其中“complete”包括
import
语句。这可能需要您创建一个报废项目,在该项目中重现问题。。。如果你不能在那里复制它,这就给了你解决问题的途径。