2013-05-23 7 views
1

У меня эта проблема в Android. Рассмотрим три фрагмента: A, B, C. C можно назвать от A или от B. Нужно ли вообще знать, из какого фрагмента был вызван фрагмент, C?Как узнать, какой фрагмент называется другим фрагментом?

Отредактированные

Ok ребята я собираюсь объяснить, что я пытаюсь сделать. Предположим, у меня есть этот вызов: A называет B, B называет C.

Когда я нажимаю кнопку «Назад» на «C», я добираюсь до B, это прекрасно. Но когда я снова нажмите кнопку назад, он принимает меня к С, вместо А.

Это мой код:

@Override 
public void onBackPressed() { 

    //this is the current fragment 
    Fragment fragmentActual =  this.getSupportFragmentManager().findFragmentById(android.R.id.tabcontent); 

    String fragmentTag = fragmentoActual.getTag().toString(); 

      //If I press the back button in C: 
    if(fragmentTag.equals("TAG C")){ 

     Fragment removefragment = this.getSupportFragmentManager().findFragmentByTag("TAG B"); 
     Fragment fragmentClient = this.getSupportFragmentManager().findFragmentByTag("TAG C"); 

     //If Im NOT passing arguments to B, I know this is a new form 
     if(removefragment.getArguments()== null){ 

          //I always pass arguments to fragment C, but just in case: 
      if(fragmentClient.getArguments()!= null){ 

       Bundle mArguments = fragmentClient.getArguments(); 

            //FRAGMENT B 
       FragmentB fragmentB = new FragmentB(); 
       fragment.setArguments(mArguments); 

       FragmentManager manager = this.getSupportFragmentManager(); 
       FragmentTransaction ft = manager.beginTransaction(); 


       ft.addToBackStack(null); 
        ft.replace(android.R.id.tabcontent,fragmentB,"TAG B"); 
        ft.commit(); 
       } 
     }else{ 

      super.onBackPressed(); 
     } 

    }else{ 
     super.onBackPressed(); 
    } 

} 

Теперь я собираюсь объяснить код. В основном, это то, что нужно заменить фрагмент B, когда вызывается фрагмент C. Я делаю это, потому что мне нужно передать аргументы фрагменту B. Но когда я делаю замену, «история» фрагмента B теряется, я имею в виду, когда я нажимаю кнопку в B, я не могу вернуться к фрагменту A (ЗДЕСЬ, ПОЧЕМУ Я ХОТЕЛ ЗНАТЬ, ЕСЛИ Я МОГУ ЗНАТЬ, КОТОРЫЕ ЗВОНИТ, КОТОРЫЕ).

В то время, когда я вызываю фрагмент B, я не передаю аргументы, потому что это пустая форма. Но когда я звоню на C, оставаясь в B, мне нужно передать аргументы фрагменту B (когда нажата кнопка «Назад»), поэтому он может отображать обновленную информацию.

Пожалуйста, если есть что-то непонятное, дайте мне знать, чтобы я мог лучше объяснить себя.

Отредактировано 2: У этой проблемы есть что-то с этим https://stackoverflow.com/questions/16703604/back-press-button-when-i-save-a-form-for-the-first-time-a-list-view-is-not-updat. Возможно, моя идея более ясна.

+0

Вы ищете возможности 'introspection' для android. – fotanus

+0

Можете ли вы рассказать мне больше об этом? – kiduxa

+0

Фрагмент не должен требовать знать, какой другой фрагмент «называет» его. – Luksprog

ответ

3

Ответ Luksprog, который я считаю лучшим: «Возможно, вы захотите решить эти проблемы. У вас всегда есть возможность передать Bundle с данными только что созданному фрагменту, который упоминает, кто его назвал, а затем используя getArgument() в фрагмент узнает, кто его назвал ».

Я еще не нашел другого пути.

0

Что вы делаете переход между фрагментами, называют addToBackStack() как часть вашего FragmentTransaction:

я думаю, это то, что вам нужно.

private final static String TAG_FRAGMENT = "TAG_FRAGMENT"; 

private void showFragment() { 
    final Myfragment fragment = new MyFragment(); 
    final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.fragment, fragment, TAG_FRAGMENT); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

@Override 
public void onBackPressed() { 
    final Myfragment fragment = (Myfragment) getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); 

    if (fragment.allowBackPressed()) { // and then you define a method allowBackPressed with the logic to allow back pressed or not 
     super.onBackPressed(); 
    } 
} 
+0

Я отредактировал свой вопрос, пожалуйста, взгляните – kiduxa

0

Вы можете использовать FragmentManager для создания задней части ваших фрагментов. Вы также должны сначала работать с Fragment Transactions. Дальнейшую информацию см .: http://developer.android.com/guide/components/fragments.html#Transactions

+0

Я отредактировал мой вопрос, пожалуйста, взгляните – kiduxa

1

Вы можете использовать метод setTargetFragment для установки родительского фрагмента. Затем вы можете использовать метод getTargetFragment, чтобы узнать, кто звонил вам.

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