Трабл с TabActivity

Интерфейс, диалоги, темы, стили, меню
AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 11:20

Исходя из этого урока сделал приложение с 3 вкладками используя естественно табы.

Подскажите как сделать так, чтобы активити первого таба не прерывалось не возобновлялось и тд. (Pause, Resume).

К примеру на первой вкладке есть MediaPlayer который играет потоковое аудио. При переходе на вторую вкладку или третью - он обрубается. Подскажите как лучше осуществить. Заранее спасибо.

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

Re: Трабл с TabActivity

Сообщение klblk » 11 дек 2014, 11:43

TabActivity устарел, используйте фрагменты.

AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Re: Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 11:49

klblk писал(а):TabActivity устарел, используйте фрагменты.
Плохо представляю как реализовать то же самое с помощью фрагментов. Да и табы отлично работают к тому же для моих простеньких целей.

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

Re: Трабл с TabActivity

Сообщение Mikhail_dev » 11 дек 2014, 11:55

Подскажите как сделать так, чтобы активити первого таба не прерывалось не возобновлялось и тд. (Pause, Resume).
Никак не сделать. Возможно поэтому и deprecated
Плохо представляю как реализовать то же самое с помощью фрагментов.
Выводите табы как просто верзушка. А сами фрагменты будут лежать во ViewPager. Тогда по нажатию на кнопочку таба, вы будете менять позицию во ViewPager. Т.е. другими словами, создайте сначала приложение со вьюПейджером на ваши три фрагмента, а после табы прицепить, это 10 минутное дело.

AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Re: Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 13:10

Mikhail_dev писал(а):
Подскажите как сделать так, чтобы активити первого таба не прерывалось не возобновлялось и тд. (Pause, Resume).
Никак не сделать. Возможно поэтому и deprecated
Плохо представляю как реализовать то же самое с помощью фрагментов.
Выводите табы как просто верзушка. А сами фрагменты будут лежать во ViewPager. Тогда по нажатию на кнопочку таба, вы будете менять позицию во ViewPager. Т.е. другими словами, создайте сначала приложение со вьюПейджером на ваши три фрагмента, а после табы прицепить, это 10 минутное дело.
Вот по этому уроку запилил ViewPager, все работает, ограничил кол-во страниц до трех, но как заполнить их контентом пока не особо понимаю.

Единственное, что пока пришло в голову это использовать конструкцию switch() case.. в public View onCreateView, чтобы выводить определенный xml файлик и код к нему. Но ничерта не получается.

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

Re: Трабл с TabActivity

Сообщение Mikhail_dev » 11 дек 2014, 15:43

Не пойму, у вас получилось вставить ViewPager или не получилось? а то вроед работает, а с другой стороны контентом и не наполнили.
но как заполнить их контентом пока не особо понимаю.
Посмотрите еще раз код того урока и обратите внимание на этот код. Я взял его с того урока и немного модифицировал ручками
[syntax=java5]
private class MyFragmentPagerAdapter extends FragmentPagerAdapter {

public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}

//метод создания ваших фрагментов
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new MyFragment1();
break;
case 1:
return new MyFragment2();
break;
case 2:
return new MyFragment3();
break;
}
return PageFragment.newInstance(position);
}

@Override
public int getCount() {
return 3;
}

}
[/syntax]
вот так наполняется он. это динамическое создание фрагмента. Т.е. фрагмент создается в коде, а не в XML указывается.

AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Re: Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 16:20

Mikhail_dev писал(а):Не пойму, у вас получилось вставить ViewPager или не получилось? а то вроед работает, а с другой стороны контентом и не наполнили.
но как заполнить их контентом пока не особо понимаю.
Посмотрите еще раз код того урока и обратите внимание на этот код. Я взял его с того урока и немного модифицировал ручками
[syntax=java5]
private class MyFragmentPagerAdapter extends FragmentPagerAdapter {

public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}

//метод создания ваших фрагментов
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new MyFragment1();
break;
case 1:
return new MyFragment2();
break;
case 2:
return new MyFragment3();
break;
}
return PageFragment.newInstance(position);
}

@Override
public int getCount() {
return 3;
}

}
[/syntax]
вот так наполняется он. это динамическое создание фрагмента. Т.е. фрагмент создается в коде, а не в XML указывается.

Все получается пока. Сделал 3 xml файлика с нужными интерфейсами (first, second, third)

В PageFragment.java в onCreateView прописал следующее.

[syntax=java5]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View a = null;
switch (pageNumber)
{
case 0:
a = inflater.inflate(R.layout.first, null);
break;
case 1:
a = inflater.inflate(R.layout.second, null);
break;
case 2:
a = inflater.inflate(R.layout.third, null);
break;
}

return a;
}
}
[/syntax]

Все работает, при перелистывании все меняется как надо. Теперь необходимо подключить к каждому "экрану" свой код. Буду сейчас пытаться.

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

Re: Трабл с TabActivity

Сообщение Mikhail_dev » 11 дек 2014, 16:35

Вы как-то так делаете
Изображение

Вы можете не создавать так фрагменты, а создать их динамически? Вот как я создаю фрагмент
[syntax=java5]
private void showVehicleListFragment() {
VehicleListFragment vehicleListFragment = (VehicleListFragment)
getSupportFragmentManager().findFragmentByTag("my_fragment_tag");

if (vehicleListFragment == null) {
vehicleListFragment = new VehicleListFragment();
}

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.my_container, vehicleListFragment, "my_fragment_tag");
transaction.commit();
}
[/syntax]
Дальше в вашей активности должен быть контейнер с тегом my_container
[syntax=xml]
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_container"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</FrameLayout>
[/syntax]
в активности пишете
[syntax=java5]
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
showVehicleListFragment();
}
[/syntax]

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

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

Re: Трабл с TabActivity

Сообщение Mikhail_dev » 11 дек 2014, 16:37

И вы вообще не в том месте создаёте все фрагменты, к тому же неправильно. Я код привёл где и как его создавать. Пересмотрите еще раз урок что сами и привели

AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Re: Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 16:59

Mikhail_dev писал(а):И вы вообще не в том месте создаёте все фрагменты, к тому же неправильно. Я код привёл где и как его создавать. Пересмотрите еще раз урок что сами и привели
Зачем мне вообще нужно создавать фрагмент динамически?

т.е. мне удобней несколько xml написать чем в коде прописывать это все.

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

Re: Трабл с TabActivity

Сообщение Mikhail_dev » 11 дек 2014, 17:20

А код обработки фрагмента вы тоже в XML пишете? И как вы будете работать с адаптером?
И что это за код?
[syntax=xml]@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View a = null;
switch (pageNumber)
{
case 0:
a = inflater.inflate(R.layout.first, null);
break;
case 1:
a = inflater.inflate(R.layout.second, null);
break;
case 2:
a = inflater.inflate(R.layout.third, null);
break;
}

return a;
}
}[/syntax]
Откуда берется pageNumber?
Зачем мне вообще нужно создавать фрагмент динамически?
"Зачем мне Fragment, когда есть Activity?". Тоже ведь верно?

AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Re: Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 17:26

Mikhail_dev писал(а):А код обработки фрагмента вы тоже в XML пишете? И как вы будете работать с адаптером?
И что это за код?
Откуда берется pageNumber?
Это измененный мной код PageFragment.java из урока.
[syntax=java5]
package fragg.com;

import java.io.IOException;
import java.util.Random;

import android.graphics.Color;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

public class PageFragment extends Fragment {

static final String ARGUMENT_PAGE_NUMBER = "arg_page_number";

int pageNumber;

static PageFragment newInstance(int page) {
PageFragment pageFragment = new PageFragment();
Bundle arguments = new Bundle();
arguments.putInt(ARGUMENT_PAGE_NUMBER, page);
pageFragment.setArguments(arguments);
return pageFragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);


}

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

// Тут я в зависимости от текущей страницы вывожу требуемый xml
View a = null;
switch (pageNumber)
{
case 0:
a = inflater.inflate(R.layout.first, null);
break;
case 1:
a = inflater.inflate(R.layout.second, null);
break;
case 2:
a = inflater.inflate(R.layout.third, null);
break;
}

return a;
}
}
[/syntax]

Все xml файлы выводятся отлично. Но теперь проблема в том, как каждому из них присвоить нужный код. Я пока не понял.

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

Re: Трабл с TabActivity

Сообщение Mikhail_dev » 11 дек 2014, 17:35

Вы ViewPager мне покажите весь код.

AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Re: Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 17:38

Mikhail_dev писал(а):Вы ViewPager мне покажите весь код.
Полагаю это в MainActivity.java

[syntax=java5]
package fragg.com;

import java.io.IOException;

import fragg.com.R.string;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;

public class MainActivity extends FragmentActivity {

static final String TAG = "myLogs";
static final int PAGE_COUNT = 3;

ViewPager pager;
PagerAdapter pagerAdapter;

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

pager = (ViewPager) findViewById(R.id.pager);
pagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
pager.setAdapter(pagerAdapter);

pager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int position) {
Log.d(TAG, "onPageSelected, position = " + position);
}

@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}

@Override
public void onPageScrollStateChanged(int state) {
}
});
}

private class MyFragmentPagerAdapter extends FragmentPagerAdapter {


public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}


@Override
public CharSequence getPageTitle(int position) {

String result = "null";

switch (position)
{
case 0:
result = "Вкладка 1";
break;
case 1:
result = "Вкладка 2";
break;
case 2:
result = "Вкладка 3";
break;
}

return result;

}

@Override
public Fragment getItem(int position) {




return PageFragment.newInstance(position);
}

@Override
public int getCount() {
return 3;
}

}

}
[/syntax]

Да и кроме PageFragment.java и MainActivity.java у меня больше ничего нет.
Последний раз редактировалось AlexS 11 дек 2014, 17:46, всего редактировалось 1 раз.

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

Re: Трабл с TabActivity

Сообщение Mikhail_dev » 11 дек 2014, 17:46

Вот ваш код. Здесь и создаются фрагменты.
[syntax=java5]
@Override
public Fragment getItem(int position) {
return PageFragment.newInstance(position);
}
[/syntax]
Переделайте на это например
[syntax=java5]
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
pageFragment1 = PageFragment.newInstance(position);
return pageFragment1;
case 1:
pageFragment2 = PageFragment.newInstance(position);
return pageFragment2;
case 2:
pageFragment3 = PageFragment.newInstance(position);
return pageFragment3;
}
return
}
[/syntax]
Ссылки на фрагменты вынесите в глобальные переменные
PageFragment pageFragment1;
PageFragment pageFragment2;
PageFragment pageFragment3;

AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Re: Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 17:49

Mikhail_dev писал(а):Вот ваш код. Здесь и создаются фрагменты.

Ссылки на фрагменты вынесите в глобальные переменные
PageFragment pageFragment1;
PageFragment pageFragment2;
PageFragment pageFragment3;
Ссылки должны быть на классы с нужным мне кодом или я не правильно понял?

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

Re: Трабл с TabActivity

Сообщение Mikhail_dev » 11 дек 2014, 17:52

Ну это ваши фрагменты. Суть в том, что Адаптер создаёт фрагмент по его идентификатору. И не обязательно это должен быть один PageFragment

AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Re: Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 18:43

[syntax=java5]
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
pageFragment1 = PageFragment.newInstance(position);
return pageFragment1;
case 1:
pageFragment2 = PageFragment.newInstance(position);
return pageFragment2;
case 2:
pageFragment3 = PageFragment.newInstance(position);
return pageFragment3;
}
return // на него ругань
}
[/syntax]

Все хорошо но ругается на return, если ему значение не присвоено.

return null; вроде решает проблему.

AlexS
Сообщения: 14
Зарегистрирован: 10 дек 2014, 19:30

Re: Трабл с TabActivity

Сообщение AlexS » 11 дек 2014, 19:33

Mikhail_dev писал(а):Ну это ваши фрагменты. Суть в том, что Адаптер создаёт фрагмент по его идентификатору. И не обязательно это должен быть один PageFragment

Все, фрагменты переключаются код работает. Но теперь кое-какие траблы внутри фрагментов. В одном из фрагментов в onCreate пытаюсь вставить webview - ругается.

[syntax=java5]
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


WebView mWebView;

mWebView = (WebView) findViewById(R.id.webView1); // ругается на findvievbyid
// включаем поддержку JavaScript
mWebView.getSettings().setJavaScriptEnabled(true);
// указываем страницу загрузки
mWebView.loadUrl("http://vk.cc/3fd0qL");

mWebView.setWebViewClient(new WebViewClient());

pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);




}
[/syntax]

Почитал что нужно писать так и в onCreateView

[syntax=java5]
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.second, null);

WebView mWebView;

mWebView = (WebView) getView().findViewById(R.id.webView1);
// включаем поддержку JavaScript
mWebView.getSettings().setJavaScriptEnabled(true);
// указываем страницу загрузки
mWebView.loadUrl("http://vk.cc/3fd0qL");

mWebView.setWebViewClient(new WebViewClient());

pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);

return view;

}
[/syntax]

В таком случае ошибки при компиляции нет - при запуске крашится.

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

Re: Трабл с TabActivity

Сообщение Mikhail_dev » 11 дек 2014, 20:25

Почитайте про жизненный цикл фрагмента. onCreateView - в этот момент создаётся сама втюшка фрагмента, но он еще не готов. Он будет готов когда вызовется метод onActivityCreated, который означает что и активность создалась, и фрагмент.
Так что код
[syntax=java5]
// включаем поддержку JavaScript
mWebView.getSettings().setJavaScriptEnabled(true);
// указываем страницу загрузки
mWebView.loadUrl("http://vk.cc/3fd0qL");

mWebView.setWebViewClient(new WebViewClient());

pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);
[/syntax]
перенесите туда

Ответить