从片段内部重新加载片段

7

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

我查看了这个问题,但我希望能有更详细的例子来说明我如何实现这个目标。

非常感谢任何帮助或指导。

@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 的答案时:
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)

看起来可能是片段视图的 XML 存在问题,您能否也发布一下它呢? - Matthew Mcveigh
我已经更新了我的回答 :) - Jack
3个回答

6

在 Fragment 中添加以下内容:

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更改为

case R.id.random:

mCallbacks.onButtonClicked();
break;

使您的FragmentActivity实现YourFragment.Callbacks接口:
public class YourActivityName extends FragmentActivity implements YourFragment.Callbacks

在包含 Fragment 的 FragmentActivity 中添加以下内容:
    @Override
    public void onButtonClicked() {
        getSupportFragmentManager().beginTransaction()
        .replace(R.id.gridView, new Fragment3())
        .commit();

    }

谢谢帮助,我遇到了崩溃。我已经更新了我的答案。 - Jack
@Jack 很抱歉之前提供了错误的方法。我已经编辑了我的答案。记得将“YourActivityName”更改为您实际拥有的FragmentActivity名称。同时将“YourFragment”更改为实际名称。 - Siu
因为我已经将我的Fragment设置为"public class Fragment3 extends Fragment implements AdapterView.OnItemClickListener {",所以我无法使用"public class YourActivityName extends FragmentActivity implements YourFragment.Callbacks"。 - Jack
@Jack 不是的,这是声明包含 Fragment3 的 FragmentActivity。例如,你有一个名为 "ImageGridActivity" 的 FragmentActivity,其中包含 "Fragment3"。然后你需要像这样声明你的 FragmentActivity:public class ImageGridActivity extends FragmentActivity implements Fragment3.Callbacks - Siu
好的,现在我明白了,我会尝试一下的 =) - Jack
1
很高兴听到这个消息!我曾经在Fragment和FragmentActivity方面遇到了很多困难,所以现在能够帮助别人真的让我感到非常开心。 - Siu

6

只需两行代码即可完成此操作,将其添加到您的刷新/重新加载按钮中(Kotlin 代码)

try_again_button.setOnClickListener {
                val ft = fragmentManager!!.beginTransaction()
                ft.detach(this).attach(this).commit()
            }

0
你只需要分离片段并重新附加即可。一行代码就足够了:
getActivity().getSupportFragmentManager().beginTransaction().detach(this).attach(this).commit();

2
你可能需要解释一下为什么这段代码可以解决问题。 - BDL
你好!虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Brian61354270

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接