як дізнатися, який фрагмент називається іншим фрагментом?

У мене ця проблема на Android. Розглянемо три фрагменти: A , B , C . C можна викликати з A або з B . Чи потрібно знати, з якого фрагмента було викликано C ?

Відредаговано

Гаразд хлопці, я збираюся пояснити, що я намагаюся зробити. Припустимо, у мене є цей дзвінок: виклики B, B виклики C.

Коли я натискаю кнопку "Назад" в C, вона отримує мене до Б, це нормально. Але коли я ще раз натискаю кнопку "Назад", вона забирає мене на C, а не на А.

Це мій код:

@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. Але коли я виконую заміну, "історія" фрагмента B втрачається, я маю на увазі, коли я натискаю кнопку "назад" у B, я не можу повернутися до фрагмента A < strong> (Ось чому я хотів би знати, якщо я можу знати, хто називає кого) .

Час, коли я називаю фрагмент B, я не передаю аргументи, тому що це порожня форма. Але коли я зателефоную в C, перебуваючи в B, мені потрібно передати аргументи для фрагмента B (коли натискається кнопка "Назад"), тож вона може показувати оновлену інформацію.

Please if there something that is not clear, let me know so I can explain myself better.

Edited 2: This issue has something with this https://stackoverflow.com/questions/16703604/back-press-button-when-i-save-a-form-for-the-first-time-a-list-view-is-not-updat. Maybe it does my idea more clear.

1
Чи можете ви сказати мені про це більше?
додано Автор kiduxa, джерело
Чи можете ви сказати мені про це більше?
додано Автор kiduxa, джерело
У моєму випадку мені це потрібно, тому що я маю проблеми наBackButtonPressed. Мені потрібно знати, хто дзвонить кому, тому я можу повернути відповідний фрагмент при натисканні кнопки "Назад".
додано Автор kiduxa, джерело
У моєму випадку мені це потрібно, тому що я маю проблеми наBackButtonPressed. Мені потрібно знати, хто дзвонить кому, тому я можу повернути відповідний фрагмент при натисканні кнопки "Назад".
додано Автор kiduxa, джерело
Я відредагував моє запитання, будь ласка, подивіться
додано Автор kiduxa, джерело
Я відредагував моє запитання, будь ласка, подивіться
додано Автор kiduxa, джерело
Ви шукаєте можливості introspection for android.
додано Автор fotanus, джерело
Фрагмент не повинен вимагати, щоб знати, який інший фрагмент "називається" його.
додано Автор Luksprog, джерело
Фрагмент не повинен вимагати, щоб знати, який інший фрагмент "називається" його.
додано Автор Luksprog, джерело
Ви можете вирішити ці питання. У вас завжди є можливість передачі пакета даних з новим фрагментом із зазначенням того, хто його називав. Тоді, використовуючи getArgument() в фрагменті, буде відомо, хто його викликав.
додано Автор Luksprog, джерело
Ви можете вирішити ці питання. У вас завжди є можливість передачі пакета даних з новим фрагментом із зазначенням того, хто його називав. Тоді, використовуючи getArgument() в фрагменті, буде відомо, хто його викликав.
додано Автор Luksprog, джерело

8 Відповіді

Відповідь Люкспрога, на мою думку, найкраще: "Можливо, ви захочете вирішити ці проблеми. У вас завжди є можливість передачі пакета даних з новим фрагментом із зазначенням того, хто його назвав. Тоді використання фрагменту getArgument() буде відомо який назвав це ".

Я не знайшов іншого кращого способу.

3
додано

Відповідь Люкспрога, на мою думку, найкраще: "Можливо, ви захочете вирішити ці проблеми. У вас завжди є можливість передачі пакета даних з новим фрагментом із зазначенням того, хто його назвав. Тоді використання фрагменту getArgument() буде відомо який назвав це ".

Я не знайшов іншого кращого способу.

3
додано

Ви можете скористатись setTargetFragment , щоб визначити, який був батьківський фрагмент. Тоді ви можете скористатись методом getTargetFragment , щоб знайти хто зателефонував тобі.

1
додано

Ви можете скористатись setTargetFragment , щоб визначити, який був батьківський фрагмент. Тоді ви можете скористатись методом getTargetFragment , щоб знайти хто зателефонував тобі.

1
додано

You can use FragmentManager for creating a back stack of your fragments. You also have to work with Fragment Transactions first. Further informations see: http://developer.android.com/guide/components/fragments.html#Transactions

0
додано
Я відредагував моє запитання, будь ласка, подивіться
додано Автор kiduxa, джерело

You can use FragmentManager for creating a back stack of your fragments. You also have to work with Fragment Transactions first. Further informations see: http://developer.android.com/guide/components/fragments.html#Transactions

0
додано
Я відредагував моє запитання, будь ласка, подивіться
додано Автор kiduxa, джерело

Що ви робите, це перехід між фрагментами, виклик 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, джерело

Що ви робите, це перехід між фрагментами, виклик 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, джерело
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.