Урок 105. Android 3. Fragments. Динамическая работа

Обсуждение уроков
Prospekt
Сообщения: 41
Зарегистрирован: 30 май 2012, 23:06

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Prospekt » 25 дек 2014, 14:55

Есть 3 фрагмента A B C.

Нужно чтобы при возврате с фрагмента C приложение возвращалось к фрагменту A.

Пробовал так:
Из A в B

Код: Выделить всё

FragmentTransaction transaction = getFragmentManager().beginTransaction();
Fragment nextScreen = new FragmentB();
transaction.replace(R.id.my_frame, nextScreen);
transaction.addToBackStack(null);
transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
transaction.commit();
Из B в C

Код: Выделить всё

FragmentTransaction transaction = getFragmentManager().beginTransaction();
Fragment nextScreen = new FragmentC();
transaction.replace(R.id.my_frame, nextScreen);
//    transaction.addToBackStack(null);
transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
transaction.commit();
Нажимаю кнопку возврата, и действительно возвращаюсь в фрагмент A. Вот только после этого стек оказывается поломаным. И переход из A в B приводит к рисованию фрагмента B поверх A. Т.е. они как бы оба одновременно на экране. В чем дело?
Если убрать комментарии, чтобы из C возвращался в B, то все работает нормально.

Такое ощущение, что возвращение производится не в том BackStack.

finberg
Сообщения: 51
Зарегистрирован: 11 мар 2013, 14:20

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение finberg » 25 дек 2014, 18:55

Мне немого не понятно, если вы хотите чтобы С->A, то вам не надо фрагмент В ложить в стек, а вы не ложите в стек фрагмент C. Поясните, почему вы С не ложите в стек, а В ложите?

Prospekt
Сообщения: 41
Зарегистрирован: 30 май 2012, 23:06

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Prospekt » 25 дек 2014, 19:10

Фрагмент В - это лист, фрагмент С - это экран редактирования элемента(который выбирается на экране B)
При этом с B возвращаться должно (по кнопке back) на первоначальный фрагмент A, и с фрагмента С должна возвращаться к фрагменту A/
Поэтому я ложу B в стек, а C заменяю B.

mcdy
Сообщения: 5
Зарегистрирован: 12 дек 2014, 22:50

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение mcdy » 27 дек 2014, 00:36

Здраствуйте. Столкнулся с тупиком.
Кратко:
Есть стартовое активити, которое сразу же на всего себя открывает фрагмент с кнопками и другими элементами. Как при нажатии на кнопки в этом фрагменте создать новый фрагмент на весь экран, передать ему переменные и самоудалиться?

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

Аватара пользователя
Neustart
Сообщения: 6
Зарегистрирован: 20 фев 2015, 01:03

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Neustart » 25 фев 2015, 23:27

ОБРАЩАЮСЬ К АВТОРУ УРОКА !
Я промучился над уроком три часа. Все дело в том, что addToBackStack() нифига не работает. нажатие кнопки "Назад", выходит из приложения. Что я только не делал. Сидел изучал логи, отлавливал экспешены, все впустую.
Все дело оказалось в том, что в первых уроках, вы научили создавать в Android Studio - MainActivity. Соответственно я все время пока изучаю эти уроки так и делаю. Но уроки писались то в эклипсе, и там активи по умолчанию - Activity. Оказалось, что если наследовать MainActivity от Activity то все работает как надо. НО по умолчанию оно то наследует от ActionBarActivity !!!!!!!!!
Внесите хоть какую-то информацию об этом в урок. Я думаю я не один такой промучился пару часов над поиском решения.
Спасибо.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение klblk » 26 фев 2015, 06:21

Вероятно если в ActionBarActivity использовать Fragment'ы из support lib, то все будет нормально работать. Хотя этого я не проверял.
И исходники в уроке написаны и там наследование от Activity, а то что студия что-то как-то не так создаёт это не проблема автора уроков, т.к. вчера FragmentActivity, сегодня ActionBarActivity, а завтра еще какая-нибудь MegaUniversalActivity. Замучаешься все уроки каждый раз обновлять под каждую прихоть ide и google.
И eclipse сейчас, создавая Activity, точно также наследует от ActionBarActivity.

Аватара пользователя
TheCoder
Сообщения: 16
Зарегистрирован: 23 апр 2015, 17:23

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение TheCoder » 10 май 2015, 18:05

Всем привет. Кто может подсказать как заменить фрагмент 2 на фрагмент 1, нажав на кнопку в фрагменте 1?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение doter.ua » 10 май 2015, 18:56

TheCoder писал(а):Всем привет. Кто может подсказать как заменить фрагмент 2 на фрагмент 1, нажав на кнопку в фрагменте 1?
http://stackoverflow.com/a/18940937
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
TheCoder
Сообщения: 16
Зарегистрирован: 23 апр 2015, 17:23

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение TheCoder » 10 май 2015, 19:20

doter.ua, спасибо, но это не то, что мне нужно. Там сказано как заменить один фрагмент на другой. Мне же нужно сделать это, нажав на кнопку в первом фрагменте.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение doter.ua » 10 май 2015, 19:31

TheCoder писал(а):doter.ua, спасибо, но это не то, что мне нужно. Там сказано как заменить один фрагмент на другой. Мне же нужно сделать это, нажав на кнопку в первом фрагменте.
Сделай паблик метод в хост активити к которому можно обратиться из фрагмента.
http://stackoverflow.com/a/12659795
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Аватара пользователя
TheCoder
Сообщения: 16
Зарегистрирован: 23 апр 2015, 17:23

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение TheCoder » 10 май 2015, 19:57

Разобрался. Я просто в классе второго фрагмента как layout первый указал...

Bogdan
Сообщения: 2
Зарегистрирован: 25 май 2015, 08:03

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Bogdan » 25 май 2015, 08:09

Подскажите. Можно ли делать replace для одного и того же фрагмента? У меня есть две кнопки одна добавляет один фрагмент в контейнер вторая другой фрагмент в тот же контейнер. Если нажимать кнопки по очереди то фрагменты заменяются поочередно и ни каких проблем. Но если нажать одну и туже кнопку подряд то при втором нажатии контейнер очищается и больше фрагмент не добавляется при нажатии.

Bogdan
Сообщения: 2
Зарегистрирован: 25 май 2015, 08:03

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Bogdan » 25 май 2015, 16:38

Тут вот в чем проблема с виртуальным устройством от гугла глючит. Запустил под genymotion и на реальном устройстве так все работает нормально. Эво как.

K_Vladimir
Сообщения: 36
Зарегистрирован: 28 июн 2015, 03:13

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение K_Vladimir » 09 сен 2015, 09:59

Доброго дня! )
Вопрос уже обсуждался, но без конкретного решения.
Всё по уроку, но эта строка работает не во всех случаях if (chbStack.isChecked()) {fTrans.addToBackStack(null);},
при нажатии кнопки назад приложение просто закрывается.
А именно, при использовании:
1. import android.support.v4.app.FragmentActivity; // BackStack не работает
2. import android.support.v7.app.AppCompatActivity; // BackStack не работает - а он сегодня идет по умолчанию
3. import android.app.Activity; //BackStack РАБОТАЕТ
Подскажите новичку, как сделать чтоб работал при наследовании AppCompatActivity или FragmentActivity ???

И вообще, краткий ликбез (или урок) не помешал бы по поводу правильного выбора того от чего наследоваться, создавая новый проект.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Mikhail_dev » 09 сен 2015, 10:03

Наследуйтесь от support.v7, которая содержит в себе support.v4. Покажите свой код добавления фрагмента. У меня десятки фрагментов на этой либе и всё работает.

K_Vladimir
Сообщения: 36
Зарегистрирован: 28 июн 2015, 03:13

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение K_Vladimir » 09 сен 2015, 10:10

Mikhail_dev писал(а):Наследуйтесь от support.v7, которая содержит в себе support.v4. Покажите свой код добавления фрагмента. У меня десятки фрагментов на этой либе и всё работает.

Спасибо за такой быстрый ответ!
Как раз при использовании import android.support.v7.app.AppCompatActivity;
приложение и закрывается вместо перехода назад.

Код: Выделить всё

package com.vladimir.kushnarev.p1051_fragmentdynamic;

//import android.support.v4.app.FragmentActivity;    // BackStack не работает
import android.support.v7.app.AppCompatActivity;     // BackStack не работает
//import android.app.Activity;                                 //BackStack работает

import android.os.Bundle;

import android.app.FragmentTransaction;
import android.view.View;
import android.widget.CheckBox;


public class MainActivity extends AppCompatActivity {                 //AppCompatActivity {

    Fragment1 frag1;
    Fragment2 frag2;
    FragmentTransaction fTrans;
    CheckBox chbStack;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    ...........

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Mikhail_dev » 09 сен 2015, 10:15

Но я так и не увидел код добавления фрагмента. Лучше вообще сбросьте весь код Activity.

K_Vladimir
Сообщения: 36
Зарегистрирован: 28 июн 2015, 03:13

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение K_Vladimir » 09 сен 2015, 10:18

Mikhail_dev писал(а):Но я так и не увидел код добавления фрагмента. Лучше вообще сбросьте весь код Activity.
Код MainActivity

Код: Выделить всё

package com.vladimir.kushnarev.p1051_fragmentdynamic;

//import android.support.v4.app.FragmentActivity;    // BackStack не работает
import android.support.v7.app.AppCompatActivity;     // BackStack не работает
//import android.app.Activity;                       //BackStack работает

import android.os.Bundle;

import android.app.FragmentTransaction;
import android.view.View;
import android.widget.CheckBox;


public class MainActivity extends AppCompatActivity {                 //AppCompatActivity {

    Fragment1 frag1;
    Fragment2 frag2;
    FragmentTransaction fTrans;
    CheckBox chbStack;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        frag1 = new Fragment1();
        frag2 = new Fragment2();

        chbStack = (CheckBox)findViewById(R.id.chbStack);
    }

    public void onClick(View v) {
        fTrans = getFragmentManager().beginTransaction();
        switch (v.getId()) {
            case R.id.btnAdd:
                fTrans.add(R.id.frgmCont, frag1);
                break;
            case R.id.btnRemove:
                fTrans.remove(frag1);
                break;
            case R.id.btnReplace:
                fTrans.replace(R.id.frgmCont, frag2);
            default:
                break;
        }
        if (chbStack.isChecked()) {fTrans.addToBackStack(null);}
        fTrans.commit();
    }
}
Код одного из фрагментов:

Код: Выделить всё

package com.vladimir.kushnarev.p1051_fragmentdynamic;

/**
 * Created by Владимир on 09.09.2015.
 */

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment1, null);
    }
}

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение Mikhail_dev » 09 сен 2015, 10:41

У вас точно нет методов в активити вроде таких как onBackPressed, onKeyDown и подобных? Там может переопределяться кнопка назад. Либо в onOptionsItemSelected.
Как добавляю фрагменты я.
private void showSmsSenderFragment() {
SmsSenderFragment smsSenderFragment = (SmsSenderFragment)
getSupportFragmentManager().findFragmentByTag(UiUtil.F_SMS_SENDER);

if (smsSenderFragment == null) {
smsSenderFragment = new SmsSenderFragment();
}

FragmentTransaction smsSenderTransaction = getSupportFragmentManager().beginTransaction();
smsSenderTransaction.replace(R.id.new_vehicle_container, smsSenderFragment, UiUtil.F_SMS_SENDER);
smsSenderTransaction.addToBackStack(null);
smsSenderTransaction.commit();
}
Некоторые моменты выделил специально жирным шрифтом. Именно так создавайте фрагменты, а не в методе onCreate. Можете в принципе ссылку на фрагмент хранить (вынести SmsSenderFragment smsSenderFragment в поля класса и внутри метода оставив просто "smsSenderFragment" вместо "SmsSenderFragment smsSenderFragment"), но инициализировать её вот таким способом.
Перенесите FragmentTransaction fTrans в метод, на всякий случай. Помнится там были какие-то детали.
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment1, null);
}
поменяйте return inflater.inflate(R.layout.fragment1, null); на inflater.inflate(R.layout.fragment1, container, false)
Последний раз редактировалось Mikhail_dev 09 сен 2015, 10:57, всего редактировалось 3 раза.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 105. Android 3. Fragments. Динамическая работа

Сообщение klblk » 09 сен 2015, 10:41

K_Vladimir,
Импорты Fragment и FragmentTransaction должны быть из support lib.
Еще поменять getFragmentManager() на getSupportFragmentManager(). То что увидел, может еще что-то поменять придется.

Ответить