用DialogFragment创建一个自定义对话框

时间:2018-08-26 12:22:36

标签: android dialog android-dialogfragment

我找到了几个据称可以正常工作的示例,每个示例彼此之间都有些许差异,但是无论我尝试实现哪个示例,都会遇到相同的编译器错误。这是DialogFragment的代码。这里没有问题。

编辑:发布后,我实际上已经在代码中编码了自定义 DialogFragment。那将是一个问题,但实际上不是。我很抱歉。

public class 自定义 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中。没有不同。使我的活动扩展了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,则没有错误,但不会弹出对话框。

我显然迷路了。


P.S。这是build.gradle的{​​{1}}; app随后出现,但肯定不是问题所在:

xml

simple_dialog_fragment.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'
}

3 个答案:

答案 0 :(得分:0)

首先,您的片段名为MyDialogFragment。您正在尝试显示CustomDialogFragment。那些不一样。从问题中的代码段中,您似乎没有任何名为CustomDialogFragment的人。

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

  • 让您的活动从FragmentActivity或从FragmentActivity扩展的其他事物开始,例如AppCompatActivity

  • 让片段从android.support.v4.app.DialogFragment

  • 扩展
  • 使用getSupportFragmentManager()

(注意:我在此答案中使用的是Android支持库软件包名称-如果您使用的是AndroidX,请用androidx版替换

答案 1 :(得分:0)

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

只有3行可执行DialogFragment语句有点精简。一方面,它没有覆盖的onCreateDialog方法。并且将onClick放在Activity中并不是一个好主意,因为它引用了一个甚至没有创建的Fragment,并且因为操作是在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();
  }
}

答案 2 :(得分:0)

以下是一个简单的工作代码,用于演示DialogFragment

MyDialogFragment.java

import android.app.Activity;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;

public class MyDialogFragment extends DialogFragment {

    Activity activity = null;

    public static MyDialogFragment createInstance(Activity activity) {

        MyDialogFragment fragment = new MyDialogFragment();
        fragment.activity = activity;
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        View view = activity.getLayoutInflater().inflate(R.layout.my_custom_dialog_layout, null);

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        double height = displayMetrics.heightPixels * 0.9;
        double width = displayMetrics.widthPixels * 0.9;

        Dialog dialog = new Dialog(getActivity(), R.style.custom_theme);
        dialog.setTitle("Title Text");
        dialog.setContentView(view);
        dialog.show();
        dialog.getWindow().setLayout((int) width, (int) height);
        dialog.setCanceledOnTouchOutside(true);
        return dialog;
    }
}

my_custom_dialog_layout.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">

     ...

</LinearLayout>

styles.xml

<resources>
     ...
     ...
   <style name="custom_theme">
      <item name="android:windowIsFloating">true</item>
      <item name="android:windowBackground">@android:color/white</item>
   </style>
</resources>

现在,只需在下面一行添加即可调用并显示DialogFragment。

MyDialogFragment.createInstance(activity).show(activity.getFragmentManager(), "TAG");