android - 使用 DialogFragment 创建自定义对话框

标签 android dialog android-dialogfragment

我发现了几个假设有效的示例,每个示例都略有不同,但无论我尝试实现哪个示例,我都会遇到相同的编译器错误。下面是 DialogFragment 的代码。此处未报告任何问题。

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

公共(public)类 自定义DialogFragment 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 中。没有不同。使我的 Activity 扩展 FragmentActivity。无论我做什么,我都会在下面的 ****** 行中收到此错误:

无法解析方法'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,则不会出现错误,但不会弹出对话框。

我显然迷路了。


附言这是 appbuild.gradlexml 如下,但肯定不是问题所在:

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>

最佳答案

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

只有 3 行可执行的 DialogFragment 语句有点精简。一方面,它没有重写的 onCreateDialog 方法。将 onClick 放在 Activity 中并不是一个好主意,因为它引用了一个甚至还没有被创建的 Fragment,而且 Action 发生在 fragment

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

所以, Activity 应该是这样的:

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

这是对话 fragment 。我希望我可以说这是我的所有代码,但我从上面第一个链接的一个或其他示例中获得了所有代码。但有时这正是你所做的:

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

关于android - 使用 DialogFragment 创建自定义对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52026219/

相关文章:

android - 无法使用 Eclipse 和 Windows 8 为 phonegap 正确安装 ant

java - 保存 Google map 的部分内容

android - WindowManager$BadTokenException : Unable to add window -- token in popup window

android - 在实例化时将对象传递给 Fragment 或 DialogFragment

android - 显示带适配器的 AlertDialog 的 DialogFragment 无法在方向更改后存活

android - 在实现 DatePickerDialog 的 DialogFragment 中添加中性按钮

android - 未找到 JNI_Onload() 且 VM 正在关闭

android - LinearLayout 在 Android 其他 View 之上添加一个 View

c# - 如何欺骗windows浏览对话框?

ios - 使用默认对话框将图像上传到 Facebook