【问题标题】:Android DialogFragment throws ClassCastException from getActivity()Android DialogFragment 从 getActivity() 抛出 ClassCastException
【发布时间】:2014-05-21 13:33:46
【问题描述】:

我想获取DialogFragment中的值:在EditText中输入一个值,并更改Fragment中的TextView。

我的片段

public class MyPageActivity extends Fragment implements MyPageNicknameDialog.onNicknameListener{
...

@Override
public void setNicknameListener(String arg){
    mypage_nickname_text.setText(arg);
}
}

对话框

public class MyPageNicknameDialog extends DialogFragment{

...

public interface onNicknameListener{
    void setNicknameListener(String arg);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

    dialogView = inflater.inflate(R.layout.dialog_nickname_mypage, container, false);

    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);  
    getDialog().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    nickname_dialog_edittext = (EditText)dialogView.findViewById(R.id.nickname_dialog_edittext);
    nickname_dialog_edittext.requestFocus();
    nickname_dialog_edittext.setOnEditorActionListener( new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

            // Here thorws ClasscastExeption
            onNicknameListener activity = (onNicknameListener) getActivity();
            activity.setNicknameListener(nickname_dialog_edittext.getText().toString());
            getDialog().dismiss();

            return false;
        }
    });

    //init();

    return dialogView;
}
}

日志

05-21 22:48:42.725: E/AndroidRuntime(17131): java.lang.ClassCastException: com.hhh.kiznic.MainFragmentActivity cannot be cast to com.hhh.kiznic.MyPageNicknameDialog$onNicknameListener
05-21 22:48:42.725: E/AndroidRuntime(17131):    at com.hhh.kiznic.MyPageNicknameDialog$1.onEditorAction(MyPageNicknameDialog.java:54)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at android.widget.TextView.onEditorAction(TextView.java:4973)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at com.android.internal.widget.EditableInputConnection.performEditorAction(EditableInputConnection.java:138)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:297)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at android.os.Looper.loop(Looper.java:137)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at android.app.ActivityThread.main(ActivityThread.java:5493)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at java.lang.reflect.Method.invokeNative(Native Method)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at java.lang.reflect.Method.invoke(Method.java:525)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
05-21 22:48:42.725: E/AndroidRuntime(17131):    at dalvik.system.NativeStart.main(Native Method)

我找到了很多示例,但无法解决。如果您知道原因和解决方案,请帮助我。

【问题讨论】:

    标签: android android-fragments classcastexception android-dialogfragment android-nested-fragment


    【解决方案1】:

    MyPageActivity,即implements MyPageNicknameDialog.onNicknameListener,是一个片段而不是一个活动。 getActivity 返回承载 Fragment 的 Activity。如果它没有实现该接口,则抛出ClassCastException

    【讨论】:

      【解决方案2】:

      当您在另一个 Fragment 中打开 DialogFragment 时

      dialog.show(getChildFragmentManager(), "dialog");
      

      可以通过getParentFragment()获取父片段

      所以你的代码需要是这样的:

          @Override
          public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
      
              // Here thorws ClasscastExeption
              onNicknameListener parentFrag = (onNicknameListener) getParentFragment();
              parentFrag.setNicknameListener(nickname_dialog_edittext.getText().toString());
              getDialog().dismiss();
      
              return false;
          }
      

      【讨论】:

        【解决方案3】:

        您的类“MyPageActivity”未定义为 Activity,而是定义为 Fragment。当您使用方法getActivity() 时,您将获得托管片段“MyPageActivity”的活动,该片段未实现接口。您必须在托管“MyPageActivity”的 Activity 中实现接口,或更改“MyPageActivity”以扩展 Activity。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-10
          • 1970-01-01
          • 1970-01-01
          • 2015-07-07
          • 2015-11-02
          相关资源
          最近更新 更多