从自身内部重新加载片段 [英] Re-loading Fragment from inside itself

查看:96
本文介绍了从自身内部重新加载片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试找出如何从Fragment内定义的菜单按钮刷新Fragment的方法.

I have been trying to figure out how I would be able to refresh my Fragment from a menu button that is defined inside the Fragment.

我已经看过此处的问题,但我希望能找到一个更详细的示例,说明我将如何能够做到这一点.

I have looked at this question here but I was hoping for a more detailed example on how I would be able to achieve this.

任何帮助或指导将不胜感激,谢谢.

Any help or Guidance would be appreciated, thanks.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.clear_cache:
        mImageFetcher.clearCache();
        Toast.makeText(getActivity(), R.string.clear_cache_complete_toast,
                Toast.LENGTH_SHORT).show();
        break;

    case R.id.random:

        //Reload the fragment from here

        getActivity().getSupportFragmentManager().beginTransaction()
        .replace(R.id.gridView, new Fragment3())
        .commit();


        return true;
    }
    return super.onOptionsItemSelected(item);

XML:

        <activity
        android:name="com.stackoverflow.question.ImageGridActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme" >
        </activity>

崩溃:

12-04 09:48:27.636: E/AndroidRuntime(20461): FATAL EXCEPTION: main
12-04 09:48:27.636: E/AndroidRuntime(20461): java.lang.UnsupportedOperationException: addView(View) is not supported in AdapterView
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.widget.AdapterView.addView(AdapterView.java:451)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.os.Handler.handleCallback(Handler.java:615)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.os.Looper.loop(Looper.java:213)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at android.app.ActivityThread.main(ActivityThread.java:4787)
 12-04 09:48:27.636: E/AndroidRuntime(20461):   at java.lang.reflect.Method.invokeNative(Native Method)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at java.lang.reflect.Method.invoke(Method.java:511)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
12-04 09:48:27.636: E/AndroidRuntime(20461):    at dalvik.system.NativeStart.main(Native Method)

使用@Matthew Mcveigh答案时:

When using @Matthew Mcveigh answer:

12-04 10:05:09.315: E/AndroidRuntime(21072): FATAL EXCEPTION: main
12-04 10:05:09.315: E/AndroidRuntime(21072): java.lang.NullPointerException
12-04 10:05:09.315: E/AndroidRuntime(21072):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:666)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at android.os.Handler.handleCallback(Handler.java:615)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at android.os.Looper.loop(Looper.java:213)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at android.app.ActivityThread.main(ActivityThread.java:4787)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at java.lang.reflect.Method.invokeNative(Native Method)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at java.lang.reflect.Method.invoke(Method.java:511)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
12-04 10:05:09.315: E/AndroidRuntime(21072):    at dalvik.system.NativeStart.main(Native Method)

推荐答案

Inside Fragment中放了这些:

Inside Fragment put these:

private Callbacks mCallbacks;


public interface Callbacks {
        //Callback for when button clicked.
        public void onButtonClicked();
}


@Override
public void onAttach(Activity activity) {
        super.onAttach(activity);
        // Activities containing this fragment must implement its callbacks
        mCallbacks = (Callbacks) activity;

}

在onOptionsItemSelected中更改为

In onOptionsItemSelected change to

case R.id.random:

mCallbacks.onButtonClicked();
break;

使您的FragmentActivity来实现YourFragment.Callbacks:

Make your FragmentActivity to implements YourFragment.Callbacks :

public class YourActivityName extends FragmentActivity implements YourFragment.Callbacks

在包含Fragment的FragmentActivity内添加以下内容:

Inside the FragmentActivity containing the Fragment add this:

    @Override
    public void onButtonClicked() {
        getSupportFragmentManager().beginTransaction()
        .replace(R.id.gridView, new Fragment3())
        .commit();

    }

这篇关于从自身内部重新加载片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆