Android 使用DialogFragment创建自定义对话框
我发现了几个假定可以工作的示例,每个示例都有点不同,但是无论我尝试实现哪个示例,都会得到相同的编译器错误。下面是Android 使用DialogFragment创建自定义对话框,android,dialog,android-dialogfragment,Android,Dialog,Android Dialogfragment,我发现了几个假定可以工作的示例,每个示例都有点不同,但是无论我尝试实现哪个示例,都会得到相同的编译器错误。下面是对话框片段的代码。这里没有问题报告 编辑:在我发布之后,我实际上已经在我的代码中编码了自定义对话框片段。这可能是个问题,但事实并非如此。我道歉 public类自定义DialogFragment扩展DialogFragment { @Override public View onCreateView(LayoutInflater inflater, Vie
对话框片段的代码。这里没有问题报告
编辑:在我发布之后,我实际上已经在我的代码中编码了自定义对话框片段。这可能是个问题,但事实并非如此。我道歉
public类
自定义DialogFragment扩展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
静态
。没有区别。我已将代码从onClick
移动到onCreate
。没有区别。使我的活动扩展FragmentActivity
。无论我做什么,我都会在下面的******行中得到此错误:
无法解析方法“show(android.app.FragmentManager,java.lang.String)”
活动的代码
:
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
,也不会显示任何对话框。(如果仅从一侧删除自定义,则会出现编译器错误。强制转换失败。)
如果我使用getSupportFragmentManager()
代替与*******的行中的fm
,则不会出现错误,但不会弹出对话框
我显然迷路了
这里是应用程序的构建.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'
}
简单对话框\u 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版本)我做了很久以前就应该做的事情:通读并记下“需要了解的一切”,并寻找提示和记录,最后还有很多关于主题的信息。有关对话框的问题
?去那里
只有3行可执行的DialogFragment
语句有点贫乏。首先,它没有被重写的onCreateDialog
方法。将onClick
放在活动中并不是一个好主意,因为它引用了一个甚至还没有创建的片段,而且动作发生在片段中
正如@commonware所指出的,我应该使用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();
}
}
您创建了一个名为MyDialogFragment的类,nit customDialogFragment因此使用MyDialogFragment。这一点很好@shubhamgarg1,但正如我的编辑所指出的,我正在处理的代码实际上有一个名为customDialogFragment的类,而不是MyDialogFragment。所以,是的,关于错误的类名,你是绝对正确的,但这不是我遇到的问题。对不起,啊,伙计。。。对但是正如我的编辑和注释所示,我在提交时的代码中没有类名和对象名不匹配的错误。我更改了DialogFragment名称,因为任何以“My”开头的对象都有点幼稚。所以这不是我遇到的问题。假设我也有同样的问题,也许我应该在实施你的建议后以新的思路提交问题。。也许我应该删除这个问题,因为现在它只是愚蠢的。我敢要求用编辑过的正确类定义再看一眼吗?@DSlomer64:很可能“我在这一行上得到了这个错误”的问题是您有一组不匹配的片段实现。在你的问题中,这之后的一切都是非常模糊的,而且我们也没有代码。我不能告诉你是否要删除这个问题。我唯一的建议是,如果你问了一个新问题,你应该提供完整的未经编辑的源代码,其中“complete”包括import
语句。这可能需要您创建一个报废项目,在该项目中重现问题。。。如果你不能在那里复制它,这就给了你解决问题的途径。