使用DialogFragment创建自定义对话框
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用DialogFragment创建自定义对话框相关的知识,希望对你有一定的参考价值。
我发现了几个据说可行的例子,每个都与另一个略有不同,但无论我试图实现哪个,我都得到相同的编译器错误。这是DialogFragment
的代码。这里没有问题。
编辑:我发布后,我的代码中实际编写了CustomDialogFragment。那将是一个问题,但实际上并非如此。我道歉。
public class
CustomDialogFragment 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
,则没有错误,但没有弹出对话框。
我显然迷路了。
附:这是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>
首先,您的片段名为MyDialogFragment
。你正试图展示CustomDialogFragment
。那些不一样。从您问题中的代码片段看,您似乎没有任何名为CustomDialogFragment
的内容。
修复后,您需要确保始终使用相同的片段系统。鉴于在Android 9.0+中不推荐使用本机片段,对于新开发,您应该使用库版本的片段。这将涉及:
- 让你的活动从
FragmentActivity
延伸或延伸到FragmentActivity
的其他东西,例如AppCompatActivity
- 你的片段从
android.support.v4.app.DialogFragment
扩展 - 使用
getSupportFragmentManager()
(注意:我在此答案中使用的是Android支持库程序包名称 - 如果您使用的是AndroidX,请使用androidx
版本替代)
我做了很久以前我应该做的事情:完全阅读并记下关于Dialog coding, with great examples的“一切”知识并寻找提示并在Dialog design do's and dont's做笔记,最后还有很多关于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();
}
}
以上是关于使用DialogFragment创建自定义对话框的主要内容,如果未能解决你的问题,请参考以下文章
Android自定义DialogFragment问题[重复]