Трабл с TabActivity
Трабл с TabActivity
Исходя из этого урока сделал приложение с 3 вкладками используя естественно табы.
Подскажите как сделать так, чтобы активити первого таба не прерывалось не возобновлялось и тд. (Pause, Resume).
К примеру на первой вкладке есть MediaPlayer который играет потоковое аудио. При переходе на вторую вкладку или третью - он обрубается. Подскажите как лучше осуществить. Заранее спасибо.
Подскажите как сделать так, чтобы активити первого таба не прерывалось не возобновлялось и тд. (Pause, Resume).
К примеру на первой вкладке есть MediaPlayer который играет потоковое аудио. При переходе на вторую вкладку или третью - он обрубается. Подскажите как лучше осуществить. Заранее спасибо.
Re: Трабл с TabActivity
TabActivity устарел, используйте фрагменты.
Re: Трабл с TabActivity
Плохо представляю как реализовать то же самое с помощью фрагментов. Да и табы отлично работают к тому же для моих простеньких целей.klblk писал(а):TabActivity устарел, используйте фрагменты.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Трабл с TabActivity
Никак не сделать. Возможно поэтому и deprecatedПодскажите как сделать так, чтобы активити первого таба не прерывалось не возобновлялось и тд. (Pause, Resume).
Выводите табы как просто верзушка. А сами фрагменты будут лежать во ViewPager. Тогда по нажатию на кнопочку таба, вы будете менять позицию во ViewPager. Т.е. другими словами, создайте сначала приложение со вьюПейджером на ваши три фрагмента, а после табы прицепить, это 10 минутное дело.Плохо представляю как реализовать то же самое с помощью фрагментов.
Re: Трабл с TabActivity
Вот по этому уроку запилил ViewPager, все работает, ограничил кол-во страниц до трех, но как заполнить их контентом пока не особо понимаю.Mikhail_dev писал(а):Никак не сделать. Возможно поэтому и deprecatedПодскажите как сделать так, чтобы активити первого таба не прерывалось не возобновлялось и тд. (Pause, Resume).Выводите табы как просто верзушка. А сами фрагменты будут лежать во ViewPager. Тогда по нажатию на кнопочку таба, вы будете менять позицию во ViewPager. Т.е. другими словами, создайте сначала приложение со вьюПейджером на ваши три фрагмента, а после табы прицепить, это 10 минутное дело.Плохо представляю как реализовать то же самое с помощью фрагментов.
Единственное, что пока пришло в голову это использовать конструкцию switch() case.. в public View onCreateView, чтобы выводить определенный xml файлик и код к нему. Но ничерта не получается.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Трабл с TabActivity
Не пойму, у вас получилось вставить 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 указывается.
Посмотрите еще раз код того урока и обратите внимание на этот код. Я взял его с того урока и немного модифицировал ручкамино как заполнить их контентом пока не особо понимаю.
[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 указывается.
Re: Трабл с TabActivity
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
Вы как-то так делаете

Вы можете не создавать так фрагменты, а создать их динамически? Вот как я создаю фрагмент
[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]
и посмотрите как у вас фрагмент будет создаваться. Как научитесь динамически их создавать, так потом проще станет

Вы можете не создавать так фрагменты, а создать их динамически? Вот как я создаю фрагмент
[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
И вы вообще не в том месте создаёте все фрагменты, к тому же неправильно. Я код привёл где и как его создавать. Пересмотрите еще раз урок что сами и привели
Re: Трабл с TabActivity
Зачем мне вообще нужно создавать фрагмент динамически?Mikhail_dev писал(а):И вы вообще не в том месте создаёте все фрагменты, к тому же неправильно. Я код привёл где и как его создавать. Пересмотрите еще раз урок что сами и привели
т.е. мне удобней несколько xml написать чем в коде прописывать это все.
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Трабл с TabActivity
А код обработки фрагмента вы тоже в 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?
И что это за код?
[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?". Тоже ведь верно?Зачем мне вообще нужно создавать фрагмент динамически?
Re: Трабл с TabActivity
Это измененный мной код PageFragment.java из урока.Mikhail_dev писал(а):А код обработки фрагмента вы тоже в XML пишете? И как вы будете работать с адаптером?
И что это за код?
Откуда берется pageNumber?
[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
Вы ViewPager мне покажите весь код.
Re: Трабл с TabActivity
Полагаю это в MainActivity.javaMikhail_dev писал(а):Вы ViewPager мне покажите весь код.
[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
Вот ваш код. Здесь и создаются фрагменты.
[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;
[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;
Re: Трабл с TabActivity
Ссылки должны быть на классы с нужным мне кодом или я не правильно понял?Mikhail_dev писал(а):Вот ваш код. Здесь и создаются фрагменты.
Ссылки на фрагменты вынесите в глобальные переменные
PageFragment pageFragment1;
PageFragment pageFragment2;
PageFragment pageFragment3;
- Mikhail_dev
- Сообщения: 2386
- Зарегистрирован: 09 янв 2012, 14:45
- Откуда: Самара
Re: Трабл с TabActivity
Ну это ваши фрагменты. Суть в том, что Адаптер создаёт фрагмент по его идентификатору. И не обязательно это должен быть один PageFragment
Re: Трабл с TabActivity
[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; вроде решает проблему.
@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; вроде решает проблему.
Re: Трабл с TabActivity
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
Почитайте про жизненный цикл фрагмента. 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]
перенесите туда
Так что код
[syntax=java5]
// включаем поддержку JavaScript
mWebView.getSettings().setJavaScriptEnabled(true);
// указываем страницу загрузки
mWebView.loadUrl("http://vk.cc/3fd0qL");
mWebView.setWebViewClient(new WebViewClient());
pageNumber = getArguments().getInt(ARGUMENT_PAGE_NUMBER);
[/syntax]
перенесите туда
