ViewPager. Обновление данных в Fragment.

Интерфейс, диалоги, темы, стили, меню
lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

ViewPager. Обновление данных в Fragment.

Сообщение lamberto » 20 апр 2015, 10:48

Народ подскажите пожалуйста, кто как знает. Как обновлять Fragment во viewpager. т.к. листать что бы обновилось вообще не вариант. Данные в фрагмент идут с класса наследуемого от Broadcastreciver. Что бы поместить данные в фрагмент я просто вызываю через экземпляр public метод фрагмента, таким образом беру данные а вот как обновить по приходу ну никак не пойму. HELP ME PLS!!!

TemMax
Сообщения: 66
Зарегистрирован: 27 окт 2013, 13:46

Re: ViewPager. Обновление данных в Fragment.

Сообщение TemMax » 21 апр 2015, 22:39

пересоздать фрагмент?

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

Re: ViewPager. Обновление данных в Fragment.

Сообщение doter.ua » 21 апр 2015, 22:49

fragmentManager.beginTransaction()
.replace(R.id.container, этот_же_фрагмент)
.commit();

П.С. капни в сторону интерфейсов. Обновить по приходу что? конкретный вью? зачем весь экран обновлять?
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

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

Re: ViewPager. Обновление данных в Fragment.

Сообщение Mikhail_dev » 21 апр 2015, 23:45

Пересоздать фрагмент? Шутите?
Кстати, это еще не так просто сделать. ViewPager фиг вам даст это легко сделать. Без понимания его исходников, вам не удастся это сделать.
По теме могу сказать, что какой смысл обновлять фрагмент, которого не видно? Может имеет смысл сохранять информацию в активности и уже при переходе к нужному фрагменту менять ему информацию?
Ну если всё же так хочется, то при создании фрагмента, сохраняйте ссылку на него и сделайте возможность её получить при обращении к ViewPager. Только будьте готовы к тому, что фрагменты могут быть null.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: ViewPager. Обновление данных в Fragment.

Сообщение lamberto » 22 апр 2015, 10:30

Что это проблема я уже понял просидев над этим 4 дня... насчёт данных ,они и так берутся как надо да вот только что бы они отобразились приходиться листать, что бы произошло пересоздание... а принципиальный вопрос что бы эти данные по приходу обновлялись в Realtime. Представьте себе у вас дома стоит датчик температуры который информацию отсылает о температуре в виде sms, дак вот я его получаю, для этого у меня есть отдельный класс исключения наследуемый broadcastreciver..., там я провожу некоторые операции с текстом sms и вызываю public метод fragment3, тем самым передаю туда string. Все отлично работает, за исключением обновления... и таких фрагментов много где отображается по запросу данные от разных устройств. Если есть более изящное решение... подскажите пожалуйста!

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

Re: ViewPager. Обновление данных в Fragment.

Сообщение doter.ua » 22 апр 2015, 10:38

lamberto писал(а):Что это проблема я уже понял просидев над этим 4 дня... насчёт данных ,они и так берутся как надо да вот только что бы они отобразились приходиться листать, что бы произошло пересоздание... а принципиальный вопрос что бы эти данные по приходу обновлялись в Realtime. Представьте себе у вас дома стоит датчик температуры который информацию отсылает о температуре в виде sms, дак вот я его получаю, для этого у меня есть отдельный класс исключения наследуемый broadcastreciver..., там я провожу некоторые операции с текстом sms и вызываю public метод fragment3, тем самым передаю туда string. Все отлично работает, за исключением обновления... и таких фрагментов много где отображается по запросу данные от разных устройств. Если есть более изящное решение... подскажите пожалуйста!
Что ты обновляешь? какое вью? скинь код этого экрана целиком (джава, можно хмл в добавок)
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

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

Re: ViewPager. Обновление данных в Fragment.

Сообщение Mikhail_dev » 22 апр 2015, 10:49

Зачем обновлять данные, которые никому не видны????????!
Вы не можете гарантировать того, что невидимый фрагмент не будет прибит системой из-за нехватки памяти, так что забудьте. Андроид это не бесконечная память, где можно обновлять всё что угодно, не думая даже о том, что это что-то могло выгрузиться андроидом.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: ViewPager. Обновление данных в Fragment.

Сообщение lamberto » 22 апр 2015, 10:58

И так по порядку.
Класс. BroadcastReciver.
Кусок приёма, обработки, отдачи фрагменту.

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

 if (message.contains(Maskbalance)) {
                         result3 = message.substring(8,11);
                       // Log.d(LOG_TAG, "Результат цикла1: " + result3);
                        for (;;){
                            if (result3.contains(Masktemp1_1)){

                                break;
                            }
                            else {
                                result3 = null;
                                result3 = message.substring(8,r);
                                r++;

                            }

                        }
                        resultb = result3.replace("r.","p.");

                        r=11;

                        myfragment4.callSomePublicMethodBalance(resultb);

                       }


Теперь кусок фрагмента где принимаю.

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

public class Fragment4 extends Fragment  {

....
... 

public void callSomePublicMethodBalance(String str){
        state3 = null;
        state3 = str;

    }

.....
....

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

  View view = inflater.inflate(R.layout.fragment4, container, false);
     
        Button  btnzb = (Button) view.findViewById(R.id.button9);
        Button  btnztod = (Button) view.findViewById(R.id.button11);
        Button  btnztgd = (Button) view.findViewById(R.id.button10);

        TextView  txtzagb = (TextView) view.findViewById(R.id.zprb);
        TextView  txtzagt = (TextView) view.findViewById(R.id.zprt);
        TextView  txtsetb = (TextView) view.findViewById(R.id.setb);
        TextView txtsetgd = (TextView) view.findViewById(R.id.setgd);
        TextView   txtsetod = (TextView) view.findViewById(R.id.setod);
        txtsetgd.setText(state1);
        txtsetod.setText(state2);
        txtsetb.setText(state3);

далее обработчики кнопок.
Вот кусок MainActivity

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

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


        if (savedInstanceState == null) {

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            SlidingTabsColorsFragment fragment = new SlidingTabsColorsFragment();


            transaction.replace(R.id.sample_content_fragment,fragment);
            transaction.commit();
        }
}
sample_content_fragment - это FrameLayout который является контейнером.

SlidingTabsColorFragment - класс где берём viewpager и присваиваем adapter. (FragmentStatePagerAdapter)


Вот , как то так.

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

Re: ViewPager. Обновление данных в Fragment.

Сообщение Mikhail_dev » 22 апр 2015, 11:06

И что это даёт? Кстати SlidingTabsColorFragment - его в коде нету. Вы так и не ответили
Зачем обновлять данные, которые никому не видны????????!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: ViewPager. Обновление данных в Fragment.

Сообщение Foenix » 22 апр 2015, 11:14

я бы сделала так. Обновляла бы данные когда они реально обновляются, а потом например, в onResume фрагмента обновляла бы их показ, если они изменились.
Т.е. у тебя кажется в методе
public void callSomePublicMethodBalance(String str){
state3 = null;
state3 = str;

}
как раз и идет присвоение новых данных? так вот его и вызывать в onResume, только добавить там изменение соотв. текствью. Но чтоб два раза не менялось - завести флаг, или разбить этот метод на два - изменние данных и изменение визуальных компонент.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: ViewPager. Обновление данных в Fragment.

Сообщение lamberto » 22 апр 2015, 11:17

Вот класс SlidingTabsColorFragment

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

public class SlidingTabsColorsFragment extends Fragment {


   static int mTabsPosition = 0;



 
      
    static class SamplePagerItem {
        private final CharSequence mTitle;
        private final int mIndicatorColor;
        private final int mDividerColor;


        SamplePagerItem(CharSequence title, int indicatorColor, int dividerColor) {
            mTitle = title;
            mIndicatorColor = indicatorColor;
            mDividerColor = dividerColor;
        }
 

 
        
        CharSequence getTitle() {
            return mTitle;
        }

       
        int getIndicatorColor() {
            return mIndicatorColor;
        }
 
        int getDividerColor() {
            return mDividerColor;
        }
    }

    static final String LOG_TAG = "SlidingTabsColorsFragment";
 
    private SlidingTabLayout mSlidingTabLayout;

    

    static public ViewPager mViewPager;

   
   static public List<SamplePagerItem> mTabs = new ArrayList<SamplePagerItem>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mTabs.add(new SamplePagerItem(
                getString(R.string.tab_stream), 
                Color.BLUE, 
                Color.GRAY 
        ));

        mTabs.add(new SamplePagerItem(
                getString(R.string.tab_messages),  
                Color.RED,  
                Color.GRAY  
        ));

        mTabs.add(new SamplePagerItem(
                getString(R.string.tab_photos), 
                Color.YELLOW, 
                Color.GRAY 
        ));

        mTabs.add(new SamplePagerItem(
                getString(R.string.tab_notifications),  
                Color.GREEN,  
                Color.GRAY  
        ));
       


    }


    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_sample, container, false);
    }


    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

    
         mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
         mViewPager.setAdapter(new SampleFragmentPagerAdapter(getChildFragmentManager()));
      
 
        mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs);
        mSlidingTabLayout.setViewPager(mViewPager);

       
        mSlidingTabLayout.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {

            @Override
            public int getIndicatorColor(int position) {
                return mTabs.get(position).getIndicatorColor();
            }

            @Override
            public int getDividerColor(int position) {
                return mTabs.get(position).getDividerColor();
            }

        });



    }
 
Почему данные не видны в фрагменте есть кнопки и textview одна из кнопок запрос температуры и в этом же фрагменте должно показаться температура в textview. без всяких там перелистований)) вот
xml фрамента

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

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout4"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Запрос баланса"
        android:id="@+id/zprb"
        android:layout_alignParentTop="true"
        android:layout_alignLeft="@+id/button9"
        android:layout_alignStart="@+id/button9" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="___"
        android:id="@+id/setb"
        android:textSize="18dp"
        android:layout_alignBottom="@+id/button9"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="false"
        android:layout_marginBottom="10dp"
        android:layout_toLeftOf="@+id/button9"
        android:layout_toStartOf="@+id/button9"
        android:textAlignment="center" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Запрос температуры"
        android:id="@+id/zprt"
        android:layout_marginTop="41dp"
        android:layout_below="@+id/button9"
        android:layout_alignLeft="@+id/button9"
        android:layout_alignStart="@+id/button9" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="___"
        android:id="@+id/setgd"
        android:textSize="18dp"
        android:layout_alignBottom="@+id/button10"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="false"
        android:layout_marginBottom="10dp"
        android:textAlignment="center"
        android:layout_toLeftOf="@+id/button10"
        android:layout_toStartOf="@+id/button10" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/setod"
        android:layout_alignBottom="@+id/button11"
        android:layout_alignStart="@+id/setgd"
        android:layout_alignParentTop="false"
        android:textSize="18dp"
        android:text="___"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="10dp"
        android:layout_alignParentStart="false"
        android:textIsSelectable="false"
        android:textAlignment="center"
        android:layout_toLeftOf="@+id/button11"
        android:layout_toStartOf="@+id/button11" />

    <Button
        android:layout_width="270dp"
        android:layout_height="wrap_content"
        android:text="Запрос баланса"
        android:id="@+id/button9"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="25dp"
        android:background="@color/btnzapros1_2" />

    <Button
        android:layout_width="270dp"
        android:layout_height="wrap_content"
        android:text="Запрос температуры ГД"
        android:id="@+id/button10"
        android:background="@color/btnzapros1_2"
        android:layout_below="@+id/zprt"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="140dp" />

    <Button
        android:layout_width="270dp"
        android:layout_height="wrap_content"
        android:text="Запрос температуры ОД"
        android:id="@+id/button11"
        android:background="@color/btnzapros1_2"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="200dp" />

</RelativeLayout>

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

Re: ViewPager. Обновление данных в Fragment.

Сообщение Mikhail_dev » 22 апр 2015, 11:35

Я ничего не понял. Более того, не увидел ответ на свой вопрос, который уже и так повторял.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: ViewPager. Обновление данных в Fragment.

Сообщение lamberto » 22 апр 2015, 11:43

Я вроде бы уже не один раз ответил), может криво изъясняюсь, что скорее всего... По поводу данных.
Когда пользователь находится на странице номер 3, это фрагмент 4, там отображается следующая информация button и textview, button - для отправки sms датчику
textview - для отображение результата пришедшего с датчика.

Сорри если опять не ответил на ваш вопрос, скорее всего я его не так понимаю.

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

Re: ViewPager. Обновление данных в Fragment.

Сообщение doter.ua » 22 апр 2015, 11:57

Mikhail_dev писал(а):Я ничего не понял. Более того, не увидел ответ на свой вопрос, который уже и так повторял.
По-моему говорится об открытом фрагменте, для обновления которого предлагалось скрольнуть вперед, назад. О каких невидимых штуках идет речь?
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

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

Re: ViewPager. Обновление данных в Fragment.

Сообщение Mikhail_dev » 22 апр 2015, 12:03

писал ранее
Ну если всё же так хочется, то при создании фрагмента, сохраняйте ссылку на него и сделайте возможность её получить при обращении к ViewPager. Только будьте готовы к тому, что фрагменты могут быть null.
сохраняете ссылку на фрагмент в адаптере и обновляете данные.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: ViewPager. Обновление данных в Fragment.

Сообщение lamberto » 22 апр 2015, 12:59

сохраняете ссылку на фрагмент в адаптере и обновляете данные.
Не понимаю как нужно сделать, после создание ссылки на фрагмент в адаптере?

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: ViewPager. Обновление данных в Fragment.

Сообщение lamberto » 22 апр 2015, 13:25

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

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: ViewPager. Обновление данных в Fragment.

Сообщение Foenix » 22 апр 2015, 13:30

А чем мое объяснение не устроило?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

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

Re: ViewPager. Обновление данных в Fragment.

Сообщение Mikhail_dev » 22 апр 2015, 13:44

lamberto писал(а):
сохраняете ссылку на фрагмент в адаптере и обновляете данные.
Не понимаю как нужно сделать, после создание ссылки на фрагмент в адаптере?
Код адаптера приведите.

lamberto
Сообщения: 66
Зарегистрирован: 29 мар 2015, 23:38

Re: ViewPager. Обновление данных в Fragment.

Сообщение lamberto » 22 апр 2015, 13:55

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

 public class SampleFragmentPagerAdapter extends FragmentStatePagerAdapter {

    SlidingTabsColorsFragment slid = new SlidingTabsColorsFragment();
    public static  Fragment4 fragment4;


    SampleFragmentPagerAdapter(FragmentManager fm) {
        super(fm);

    }



    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

    @Override
    public Fragment getItem(int position) {


        if (position == 1) {

            return Fragment2.newInstance(position);
        }
        else if (position == 2){

            return Fragment3.newInstance(position);
        }
        else if (position == 3){

            fragment4 = Fragment4.newInstance(3);

            return fragment4;
        }
        else
        {

            return Fragment1.newInstance(position);}



    }
    private String makeFragmentName(int viewId, int index) {
        return "android:switcher:" + viewId + ":" + index;
    }





    @Override
    public int getCount() {
        return slid.mTabs.size();
    }


    @Override
    public CharSequence getPageTitle(int position) {
        return slid.mTabs.get(position).getTitle();
    }

}

Ответить