我发现了几个假设有效的示例,每个示例都略有不同,但无论我尝试实现哪个示例,我都会遇到相同的编译器错误。下面是 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
,则不会出现错误,但不会弹出对话框。
我显然迷路了。
附言这是 app
的 build.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'
}
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 指出的那样,我应该使用Activity
和Fragment
的支持库版本。
所以, 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/