2016-09-13 2 views
0

У меня проблема с кнопкой «назад/вверх» в фрагменте. У меня есть активность, в которой у меня есть фрагменты. В одном фрагменте, который я называю «1», у меня есть список. Когда я нажимаю на любой элемент, он переходит к другому фрагменту «2». Мне нужна функциональность, так что кнопка «назад/вверх» работает только в Фрагменте 2, но не в фрагменте 1.Фрагмент и кнопка возврата

Есть ли способ, которым это можно сделать? Я попытался это в операции, но я не понимаю, как это может помочь:

@Override 
public void onBackPressed() { 

    int count = getFragmentManager().getBackStackEntryCount(); 

    if (count == 0) { 
     super.onBackPressed(); 
     //additional code 
    } else { 
     getFragmentManager().popBackStack(); 
    } 

} 

Когда я изменяю из фрагмента 1 к фрагменту 2 у меня есть этот код:

fragment = new MaterialesFragment(); 
    FragmentManager fragmentManager3 = getFragmentManager(); 
    fragmentManager3.beginTransaction().replace(R.id.frame, fragment).addToBackStack("tagMateriales").commit(); 

Спасибо много :-)

+0

откуда туда, где вы хотите? Фрагмент2 до 1? его непонятно –

+0

Добавьте onCreate своей деятельности. И как вы добавляете второй фрагмент? Вы используете замену? Не могли бы вы дать более подробную информацию? – masp

+0

Просто используйте '.addToBackStack (null)' в вашей транзакции, которая переключается на фрагмент 2 перед его выполнением. – Vucko

ответ

0

Try использовать addToBackStack() метод на FragmentTransaction объекта, который вы используете, чтобы заменить FRAGMENT2 на экран:

fragmentManager.beginTransaction().replace(R.id.content_frame,fragment2).addToBackStack("tagHere").commit(); 

Вы можете передать null в качестве параметра, если вам не нужен фактический тег.

+0

Я уже добавил addToBackStack: S –

0

Пожалуйста, используйте этот код для «фрагмента 2»

public void showFragmentWithoutStack(Fragment fragment, String tag, int id) { 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
    transaction.add(id, fragment, tag); 
    transaction.commitAllowingStateLoss(); 
} 

Где tag может быть имя класса String, идентификатор вашего зрения корневой активности (Поскольку фрагмент должен появиться в верхнем слое).

+0

спасибо за ответ, не могли бы вы сказать мне, где я должен добавить это? thanks :) –

+0

Я бы создал этот метод В вашей деятельности, например BaseActivity. В вашей деятельности вы должны иметь этот выше метод. В фрагменте вы должны иметь метод 'protected void showFragmentWithoutStack (фрагмент фрагмента, тег String, int id) { ((BaseActivity) getActivity()). ShowFragmentWithoutStack (фрагмент, тег, id); } 'Вы должны контролировать фрагменты из активности – Michael

0

Для того, чтобы использовать onBackPressed() метод переопределения в деятельности, как у вас есть в этом вопросе, необходимо также добавить это к вашему Fragment:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case android.R.id.home: 
     // Assuming MainActivity is the Activity subclass name 
     if (getActivity() instanceof MainActivity) { 
      ((MainActivity) getActivity()).onBackPressed(); 
     } 
     return true; 
     default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

Для того, чтобы показать/скрыть кнопку назад, добавьте эти методы к вашей деятельности:

public void showUpButton() { 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
} 

public void hideUpButton() { 
    getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
} 

Затем, когда вы хотите, чтобы показать или скрыть кнопку назад/вверх от фрагмента, вызывать эти методы.

В вашем случае, вы можете скрыть заднюю кнопку/вверх от onResume() в Фрагмент 1:

((MainActivity) getActivity()).hideUpButton(); 

, а затем показать его в onResume() в фрагменте 2:

((MainActivity) getActivity()).showUpButton(); 
+0

спасибо за ответ, я добавлю это в свой фрагмент 2, но это происходит одинаково (оба фрагмента могут вернуться с помощью кнопки« назад »), я просто хочу, чтобы фрагмент 2 имеют эту функциональность, а фрагмент 1 будет иметь «блокировку». –

+0

Теперь появляется стрелка назад, но когда я нажимаю на нее, появляется меню, которое у меня есть. Можете ли вы помочь, в какой части я должен назвать фрагмент 1? спасибо за ваше время и помощь. –

+0

@StephySamaniego Кажется, вам нужно выделить случаи в методе 'onOptionsItemSelected()'. Обратите внимание на 'case android.R.id.home', вам это нужно. –

0

Есть много пути к выполнению этой работы. На мой взгляд, самым изящным является следующее. Я бы изолировал логику в каждом компоненте. Каждый фрагмент реализует интерфейс, такой как «IBackHandler», который позволяет взаимодействовать с деятельностью и фрагментом. В действии onBackPressed запрашивает сначала фрагмент (если он создан), что делать, а затем действует.

Интерфейс:

public interface IBackHandler { 
    boolean doBack(); 
} 

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

public class YourFragment1 extends YourBaseFragment implements IBackHandler { 
     // your code 
     @Override 
     public boolean doBack() { 
      // return true means that you have done your stuff 
      //and you don't want 'super.onBackPressed()' to be called 
      return true; // this means do nothing 
     } 
} 

Фрагмент 2:

public class YourFragment2 extends YourBaseFragment implements IBackHandler { 
     // your code 
     @Override 
     public boolean doBack() { 
      return false; //this means: call 'super.onBackPressed()' 
     } 
} 

Ваша активность :

public class YourActivity extends YourBaseActivity { 
    //your code 
    @Override 
    public void onBackPressed() { 
     Fragment currentFragment = getFragmentManager().findFragmentById(R.id.yourFragment); 
    if (currentFragment instanceof IBackHandler) { 
     if (!((IBackHandler) currentFragment).doBack()) { 
      super.onBackPressed(); 
     } 
    } else 
     super.onBackPressed(); 
    } 
} 

Вы можете подумать, что это слишком сложно, но я могу успокоить вас тем, что таким образом вы всегда сможете контролировать, что происходит в вашем потоке.

Надеюсь, что эта помощь!

0

Я решил эту проблему, используйте этот код, когда фрагмент изменения:

String fragmentIndexString="fragmenttwo";//or fragmentone something 
transaction.addToBackStack(); 

Это полный код в деятельности:

FirstFragment firstFragment; // my first fragment 
SecondFragment secondFragment; // my second fragment 
public static String FIRST="asfasgasg"; //first fragment index 
public static String SECOND="gsadgsagd"; //second fragment index 
... 
/* u can change fragment by using setFragment funiction */ 
public void setFragment(String page){ 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    switch (page){ 
     case FIRST: 
      if(firstFragment==null) firstFragment= SettingFragment.newInstance(); 
      if (!firstFragment.isAdded()) { 
       transaction.replace(R.id.fragmentcontainer, firstFragment); 
       transaction.addToBackStack(INDEX); 
       transaction.commit(); 
      } else { 
       transaction.show(firstFragment); 
      } 
      break; 
     case SECOND: 
      if(secondFragment==null) secondFragment= SettingFragment.newInstance(); 
      if (!secondFragment.isAdded()) { 
       transaction.replace(R.id.fragmentcontainer, secondFragment); 
       transaction.addToBackStack(INDEX); 
       transaction.commit(); 
      } else { 
       transaction.show(secondFragment); 
      } 
      break; 
     default: 
      setFragment(INDEX); 
    } 
} 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){ 
     if(fragmentManager.getBackStackEntryCount()>1){ 
      fragmentManager.popBackStack(); 
      return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+0

Привет, спасибо за ответ. Когда я изменяю от фрагмента 1 к фрагменту 2, у меня есть этот код: fragment = new MaterialesFragment(); FragmentManager fragmentManager3 = getFragmentManager(); fragmentManager3.beginTransaction(). Replace (R.id.frame, фрагмент) .addToBackStack ("tagMateriales"). Commit(); –

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

  • Нет связанных вопросов^_^