Создание Пользовательского Диалога с DialogFragment - PullRequest
0 голосов
/ 26 августа 2018

Я нашел несколько предположительно работающих примеров, каждый из которых немного отличается от другого, но, что бы я ни пытался реализовать, я получаю ту же ошибку компилятора. Вот код для 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 для app; 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>

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Я сделал то, что должен был сделать давно: полностью прочитал и сделал заметки по «всему», что нужно знать о Диалоговое кодирование, с отличными примерами , искал советы и делал заметки по Дизайн диалога делает и не делает , где также есть много информации о Theming в конце. Вопросы о Dialog?Идите туда.

Только 3 строки исполняемых операторов DialogFragment немного скудны.Во-первых, у него не было переопределенного метода onCreateDialog.И помещать onClick в Activity не было хорошей идеей, поскольку оно ссылалось на фрагмент, который даже не был создан, и поскольку действие происходит в Fragment.

И как @Commonsware указал, что я должен был использовать версии библиотеки поддержки 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();
  }
}
0 голосов
/ 26 августа 2018

Во-первых, ваш фрагмент называется MyDialogFragment.Вы пытаетесь показать CustomDialogFragment.Это не одно и то же.Из фрагментов кода в вашем вопросе может показаться, что у вас нет ничего с именем CustomDialogFragment.

. Как только вы это исправите, вам необходимо убедиться, что вы используете одну и ту же систему фрагментов последовательно.Учитывая, что нативные фрагменты устарели в Android 9.0+, для новых разработок следует использовать библиотечную редакцию фрагментов.Это может включать:

  • Расширение вашей активности от FragmentActivity или от чего-то другого, что распространяется FragmentActivity, например AppCompatActivity

  • Расширение вашего фрагмента от android.support.v4.app.DialogFragment

  • Использование getSupportFragmentManager()

(примечание: я использую имена пакетов библиотеки поддержки Android в этомответ - замените androidx редакциями, если вы используете AndroidX)

...