Вопрос:
У меня есть фрагмент, который является частью представления табуляции. Я хочу перезапустить этот фрагмент, когда я нажимаю кнопку “Назад”. но я не знаю, как его обновить. Я пробовал некоторые коды вроде этого: Перезапустить фрагмент внутри действия, но он не сработал.
вот код для обнаружения кнопки возврата:
@Override public void onResume() { super.onResume(); getView().setFocusableInTouchMode(true); getView().requestFocus(); getView().setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){ // handle back button return true; } return false; } }); }
вот кнопка класса фрагмента:
public class MoviesFragment extends Fragment { static ListView list; static String[] numbers_text = new String[] { «one», «two», «three», «four», «five», «six», «seven», «eight», «nine», «ten», «eleven», «twelve», «thirteen», «fourteen», «fifteen» }; String[] songs = new String[] { «1», «2», «3», «4», «5», «6», «7», «8», «9», «10», «11», «12», «13», «14», «15» }; MainCustomList adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_movies, container, false); adapter = new MainCustomList(this.getActivity(), numbers_text); list=(ListView) view.findViewById(R.id.list); list.setAdapter(adapter); return view; }
главный:
public class MainActivity extends FragmentActivity implements ActionBar.TabListener { private ViewPager viewPager; private TabsPagerAdapter mAdapter; private ActionBar actionBar; // Tab titles private String[] tabs = { «Top Rated», «Games», «Movies» }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initilization viewPager = (ViewPager) findViewById(R.id.pager); actionBar = getActionBar(); mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mAdapter); actionBar.setHomeButtonEnabled(false); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Adding Tabs for (String tab_name : tabs) { actionBar.addTab(actionBar.newTab().setText(tab_name) .setTabListener(this)); } /** * on swiping the viewpager make respective tab selected * */ viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { // on changing the page // make respected tab selected actionBar.setSelectedNavigationItem(position); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { // on tab selected // show respected fragment view viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } } Лучший ответ:
Используйте этот код:
YourFragmentClass fragment = (YourFragmentClass) getFragmentManager().findFragmentById(R.id.your_fragment_container_id) getFragmentManager().beginTransaction() .detach(fragment) .attach(fragment) .commit();
И это заставит ваш fragment OnCreateView метод можно назвать еще раз и обновить его макет.
ОБНОВИТЬ:
При использовании Support Library вы можете получить доступ к фрагменту следующим образом:
int YOUR_FRAGMENT_POSITION = 2; // in your case you wanna access the 3rd fragment, 0 indexed YourFragmentClass fragment = (YourFragmentClass) getSupportFragmentManager().getFragments().get(YOUR_FRAGMENT_POSITION);
И используйте тот же фрагмент кода выше:
getSupportFragmentManager().beginTransaction() .detach(fragment) .attach(fragment) .commit();
Если вы попытаетесь получить доступ к fragment через PagerAdapter, вы можете получить IllegalStateException, сообщив, что фрагмент не смог сохранить его state.