2013-12-03 2 views
3

Я пытался выяснить, как я смогу обновить свой фрагмент из кнопки меню, которая определена внутри фрагмента.Повторная загрузка фрагмента изнутри самого себя

Я посмотрел на this question here, но я надеялся на более подробный пример того, как я смогу достичь этого.

Любая помощь или руководство будут оценены, спасибо.

@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 Маквей ответ:

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) 
+0

Похоже это может быть проблема с xml фрагмента v iew, можете ли вы разместить это тоже, пожалуйста, –

+0

Я обновил свой ответ :) – Jack

ответ

4

Внутри фрагмента поместить эти:

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 

Внутри FragmentActivity, содержащего фрагмент добавить следующее:

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

    } 
+0

Спасибо за помощь, я получаю сбой. Я обновил свой ответ с обновлением. – Jack

+0

@Jack Извините, что раньше я предлагал неправильный метод. Я отредактировал свой ответ. Не забудьте изменить «YourActivityName» на реальное имя FragmentActivity. Также измените «YourFragment» на настоящее имя. – Siu

+0

Я не могу использовать «открытый класс. Расширение YourActivityName расширяет FragmentActivity реализует YourFragment.Callbacks», потому что у меня уже есть мой фрагмент, настроенный как «открытый класс Fragment3 extends Fragment реализует AdapterView.OnItemClickListener {" – Jack

Смежные вопросы