Jac*_*ack 6 android refresh android-fragments
我一直试图弄清楚如何从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);
Run Code Online (Sandbox Code Playgroud)
XML:
<activity
android:name="com.stackoverflow.question.ImageGridActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme" >
</activity>
Run Code Online (Sandbox Code Playgroud)
崩溃:
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)
Run Code Online (Sandbox Code Playgroud)
当使用@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)
Run Code Online (Sandbox Code Playgroud)
里面片段放这些:
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;
}
Run Code Online (Sandbox Code Playgroud)
在onOptionsItemSelected中更改为
case R.id.random:
mCallbacks.onButtonClicked();
break;
Run Code Online (Sandbox Code Playgroud)
使FragmentActivity实现YourFragment.Callbacks:
public class YourActivityName extends FragmentActivity implements YourFragment.Callbacks
Run Code Online (Sandbox Code Playgroud)
在包含Fragment的FragmentActivity里面添加:
@Override
public void onButtonClicked() {
getSupportFragmentManager().beginTransaction()
.replace(R.id.gridView, new Fragment3())
.commit();
}
Run Code Online (Sandbox Code Playgroud)
这可以用 2 行来完成,只需将它们添加到刷新/重新加载按钮中(Kotlin 代码)
try_again_button.setOnClickListener {
val ft = fragmentManager!!.beginTransaction()
ft.detach(this).attach(this).commit()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7372 次 |
| 最近记录: |