对话框片段无法转换为android.app.activity

时间:2014-01-21 03:09:51

标签: java android dialog android-manifest android-dialogfragment

我正在Android Developers.重新创建自定义对话框布局,并进行了微调。我收到一个问题告诉我,对话框片段无法转换为android.app.activity。我无法理解为什么我在logcat中遇到这个错误。

logcat的:

01-20 22:03:10.317: E/AndroidRuntime(9949): FATAL EXCEPTION: main
01-20 22:03:10.317: E/AndroidRuntime(9949): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.customdialogfragment/com.customdialogfragment.CustomDialogFragment}: java.lang.ClassCastException: com.customdialogfragment.CustomDialogFragment cannot be cast to android.app.Activity
01-20 22:03:10.317: E/AndroidRuntime(9949):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2004)

活动

public class CustomDialogFragment extends DialogFragment {

    static CustomDialogFragment newInstance() {
        CustomDialogFragment newFragment = new CustomDialogFragment();
        return newFragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();

        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        builder.setView(
                inflater.inflate(R.layout.activity_custom_dialog_fragment, null))
                // Add action buttons
                .setPositiveButton("Sign In",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int id) {
                                // sign in the user ...
                            }
                        })
                .setNegativeButton("Cancel",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                CustomDialogFragment.this.getDialog().cancel();
                            }
                        });
        return builder.create();
    }

    public void showMyDialog() {
        CustomDialogFragment newFragment = new CustomDialogFragment();
        newFragment.show(getFragmentManager(), "custom");
    }
}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.customdialogfragment"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.customdialogfragment.launcher"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:background="#FFFFBB33"
        android:contentDescription="@string/app_name"
        android:scaleType="center"
        android:src="@drawable/ic_launcher" />

    <EditText
        android:id="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginTop="16dp"
        android:hint="username"
        android:inputType="textEmailAddress" />

    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:layout_marginTop="4dp"
        android:fontFamily="sans-serif"
        android:hint="password"
        android:inputType="textPassword" />

</LinearLayout>

2 个答案:

答案 0 :(得分:0)

如果要显示自定义对话框片段,则无需在Manifest中定义它,而是需要创建实例并在活动中调用其show方法。这就是你收到错误的原因。您在清单中定义了一个活动: com.customdialogfragment.launcher ,您需要创建该活动,然后在活动中创建该片段。

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

public class launcher extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        showMyDialog();
    }

    public void showMyDialog() {    
      CustomDialogFragment newFragment = new CustomDialogFragment();
      newFragment.show(getSupportFragmentManager(), "custom");
    }
}

*注意:您应该重命名活动 MainActivity 或等效的

答案 1 :(得分:0)

DialogFragmentFragment的孩子,因此无法投放到Activity

创建对话框的3种方法。

  1. 使用AlertDialog,扩展Dialog。实际上它是Window
  2. 使用DialogFragment,扩展Fragment
  3. 使用对话框样式Activity,正如文档所述。
  4.   

    在大屏幕上将对象显示为对话框

         

    在小屏幕上,您可以通过在大屏幕上将“活动”显示为对话框来完成相同的结果,而不是在小屏幕上将对话框显示为全屏用户界面。您选择哪种方法取决于您的应用程序设计,但当您的应用程序已经设计为小屏幕并且您希望通过将短暂活动显示为对话框来改善平板电脑体验时,将对象显示为对话框通常很有用

         

    要仅在大屏幕上将活动显示为对话框,请将Theme.Holo.DialogWhenLarge主题应用于清单元素:

    <activity android:theme="@android:style/Theme.Holo.DialogWhenLarge" >
    

    这个需要在清单中定义。