Вопрос

I have one fragment which start another one. And I need to access method of first fragment from second. But I got an strange error.

Are anyone have ideas to solve this?

First:

public class ArticleFragment extends Fragment implements AdapterView.OnItemClickListener, View.OnTouchListener {
    public static final String TAG = ArticleFragment.class.getClass().getSimpleName();
    ...
    ArticleEditFragment mFrag = new ArticleEditFragment();
    FragmentTransaction t = getActivity().getSupportFragmentManager().beginTransaction();
    t.replace(R.id.fragment_container, mFrag, ArticleEditFragment.TAG);
    t.addToBackStack(ArticleEditFragment.TAG);
    t.commit();

Second:

public class ArticleEditFragment extends Fragment implements View.OnTouchListener, View.OnClickListener {
    public static final String TAG = ArticleEditFragment.class.getClass().getSimpleName();
    ...
ArticleFragment articleFragment = ((ArticleFragment) getActivity().getSupportFragmentManager()
            .findFragmentByTag(ArticleFragment.TAG));

Error:

java.lang.ClassCastException: com.ThreeBoots.fragments.ArticleEditFragment cannot be cast to com.ThreeBoots.fragments.ArticleFragment
            at com.ThreeBoots.fragments.ArticleEditFragment.saveClicked(ArticleEditFragment.java:101)
            at com.ThreeBoots.fragments.ArticleEditFragment.onOptionsItemSelected(ArticleEditFragment.java:81)
            at android.support.v4.app.Fragment.performOptionsItemSelected(Fragment.java:1608)
            at android.support.v4.app.FragmentManagerImpl.dispatchOptionsItemSelected(FragmentManager.java:2001)
            at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:378)
            at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:958)
            at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
            at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149)
            at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
            at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:514)
            at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:99)
            at android.view.View.performClick(View.java:4084)
            at android.view.View$PerformClick.run(View.java:16966)
            at android.os.Handler.handleCallback(Handler.java:615)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4745)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
Это было полезно?

Решение

The problem was in this line:

public static final String TAG = ArticleFragment.class.getClass().getSimpleName();

It doesb't return class name like ArticleFragment. I saw just Class in console, because I added this method .getClass(). When I remove it the problem was solved.

Result correct code is:

 public static final String TAG = ArticleFragment.class.getSimpleName();

Другие советы

You tag the fragment with

t.replace(R.id.fragment_container, mFrag, ArticleEditFragment.TAG);

But trying to retrieve it with another tag

ArticleFragment articleFragment = ((ArticleFragment) getActivity().getSupportFragmentManager()
        .findFragmentByTag(ArticleFragment.TAG));

You should use the TAG from the same model.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top