Страница 1 из 3
ViewPager. Обновление данных в Fragment.
Добавлено: 20 апр 2015, 10:48
lamberto
Народ подскажите пожалуйста, кто как знает. Как обновлять Fragment во viewpager. т.к. листать что бы обновилось вообще не вариант. Данные в фрагмент идут с класса наследуемого от Broadcastreciver. Что бы поместить данные в фрагмент я просто вызываю через экземпляр public метод фрагмента, таким образом беру данные а вот как обновить по приходу ну никак не пойму. HELP ME PLS!!!
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 21 апр 2015, 22:39
TemMax
пересоздать фрагмент?
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 21 апр 2015, 22:49
doter.ua
fragmentManager.beginTransaction()
.replace(R.id.container, этот_же_фрагмент)
.commit();
П.С. капни в сторону интерфейсов. Обновить по приходу что? конкретный вью? зачем весь экран обновлять?
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 21 апр 2015, 23:45
Mikhail_dev
Пересоздать фрагмент? Шутите?
Кстати, это еще не так просто сделать. ViewPager фиг вам даст это легко сделать. Без понимания его исходников, вам не удастся это сделать.
По теме могу сказать, что какой смысл обновлять фрагмент, которого не видно? Может имеет смысл сохранять информацию в активности и уже при переходе к нужному фрагменту менять ему информацию?
Ну если всё же так хочется, то при создании фрагмента, сохраняйте ссылку на него и сделайте возможность её получить при обращении к ViewPager. Только будьте готовы к тому, что фрагменты могут быть null.
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 10:30
lamberto
Что это проблема я уже понял просидев над этим 4 дня... насчёт данных ,они и так берутся как надо да вот только что бы они отобразились приходиться листать, что бы произошло пересоздание... а принципиальный вопрос что бы эти данные по приходу обновлялись в Realtime. Представьте себе у вас дома стоит датчик температуры который информацию отсылает о температуре в виде sms, дак вот я его получаю, для этого у меня есть отдельный класс исключения наследуемый broadcastreciver..., там я провожу некоторые операции с текстом sms и вызываю public метод fragment3, тем самым передаю туда string. Все отлично работает, за исключением обновления... и таких фрагментов много где отображается по запросу данные от разных устройств. Если есть более изящное решение... подскажите пожалуйста!
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 10:38
doter.ua
lamberto писал(а):Что это проблема я уже понял просидев над этим 4 дня... насчёт данных ,они и так берутся как надо да вот только что бы они отобразились приходиться листать, что бы произошло пересоздание... а принципиальный вопрос что бы эти данные по приходу обновлялись в Realtime. Представьте себе у вас дома стоит датчик температуры который информацию отсылает о температуре в виде sms, дак вот я его получаю, для этого у меня есть отдельный класс исключения наследуемый broadcastreciver..., там я провожу некоторые операции с текстом sms и вызываю public метод fragment3, тем самым передаю туда string. Все отлично работает, за исключением обновления... и таких фрагментов много где отображается по запросу данные от разных устройств. Если есть более изящное решение... подскажите пожалуйста!
Что ты обновляешь? какое вью? скинь код этого экрана целиком (джава, можно хмл в добавок)
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 10:49
Mikhail_dev
Зачем обновлять данные, которые никому не видны????????!
Вы не можете гарантировать того, что невидимый фрагмент не будет прибит системой из-за нехватки памяти, так что забудьте. Андроид это не бесконечная память, где можно обновлять всё что угодно, не думая даже о том, что это что-то могло выгрузиться андроидом.
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 10:58
lamberto
И так по порядку.
Класс. 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)
Вот , как то так.
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 11:06
Mikhail_dev
И что это даёт? Кстати SlidingTabsColorFragment - его в коде нету. Вы так и не ответили
Зачем обновлять данные, которые никому не видны????????!
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 11:14
Foenix
я бы сделала так. Обновляла бы данные когда они реально обновляются, а потом например, в onResume фрагмента обновляла бы их показ, если они изменились.
Т.е. у тебя кажется в методе
public void callSomePublicMethodBalance(String str){
state3 = null;
state3 = str;
}
как раз и идет присвоение новых данных? так вот его и вызывать в onResume, только добавить там изменение соотв. текствью. Но чтоб два раза не менялось - завести флаг, или разбить этот метод на два - изменние данных и изменение визуальных компонент.
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 11:17
lamberto
Вот класс 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>
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 11:35
Mikhail_dev
Я ничего не понял. Более того, не увидел ответ на свой вопрос, который уже и так повторял.
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 11:43
lamberto
Я вроде бы уже не один раз ответил), может криво изъясняюсь, что скорее всего... По поводу данных.
Когда пользователь находится на странице номер 3, это фрагмент 4, там отображается следующая информация button и textview, button - для отправки sms датчику
textview - для отображение результата пришедшего с датчика.
Сорри если опять не ответил на ваш вопрос, скорее всего я его не так понимаю.
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 11:57
doter.ua
Mikhail_dev писал(а):Я ничего не понял. Более того, не увидел ответ на свой вопрос, который уже и так повторял.
По-моему говорится об открытом фрагменте, для обновления которого предлагалось скрольнуть вперед, назад. О каких невидимых штуках идет речь?
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 12:03
Mikhail_dev
писал ранее
Ну если всё же так хочется, то при создании фрагмента, сохраняйте ссылку на него и сделайте возможность её получить при обращении к ViewPager. Только будьте готовы к тому, что фрагменты могут быть null.
сохраняете ссылку на фрагмент в адаптере и обновляете данные.
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 12:59
lamberto
сохраняете ссылку на фрагмент в адаптере и обновляете данные.
Не понимаю как нужно сделать, после создание ссылки на фрагмент в адаптере?
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 13:25
lamberto
Да и судя по комментариям почему то создается мнение что я хочу обновить фрагмент которого не вижу, это не так требуется проделать операции с текущем фрагментов на котором нахожусь то есть, обновить его.
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 13:30
Foenix
А чем мое объяснение не устроило?
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 13:44
Mikhail_dev
lamberto писал(а):сохраняете ссылку на фрагмент в адаптере и обновляете данные.
Не понимаю как нужно сделать, после создание ссылки на фрагмент в адаптере?
Код адаптера приведите.
Re: ViewPager. Обновление данных в Fragment.
Добавлено: 22 апр 2015, 13:55
lamberto
Код: Выделить всё
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();
}
}