Урок 76. Tab - вкладки. Общий обзор

Обсуждение уроков
volboy
Сообщения: 39
Зарегистрирован: 11 ноя 2013, 17:08

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение volboy » 28 мар 2014, 13:37

Создал проект, использовал android-support-v7.
Main Activity

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

package com.example.mytabs;

import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.Tab;
import android.support.v7.app.ActionBar.TabListener;
import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity implements TabListener {
	public static final String key_screen_number = "key_screen_number";
    ActionBar ab;
    FragmentTransaction ft;
    ScreenFragment screen_fragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        ab.setSelectedNavigationItem(0);
        ab = getSupportActionBar();
        ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        
        Tab tab = ab.newTab();
        tab.setText("Screen 1");
        tab.setTabListener(this);
        ab.addTab(tab, 0, true);
        
        tab = ab.newTab();
        tab.setText("Screen 2");
        tab.setTabListener(this);
        ab.addTab(tab, 1, false);
        
        tab = ab.newTab();
        tab.setText("Screen 3");
        tab.setTabListener(this);
        ab.addTab(tab, 2, false);
    }

	@Override
	public void onTabReselected(Tab tab, FragmentTransaction ft) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		 screen_fragment = new ScreenFragment();
	        Bundle args = new Bundle();
	        args.putInt(key_screen_number, tab.getPosition() + 1);
	        screen_fragment.setArguments(args);
	        
	        ft.replace(android.support.v7.appcompat.R.id.action_bar_activity_content, screen_fragment);
		
	}

	@Override
	public void onTabUnselected(Tab tab, FragmentTransaction ft) {
		// TODO Auto-generated method stub
		
	}
	 
}
ScreenFragment

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

package com.example.mafiatabs;

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;

public class ScreenFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        TextView tv = new TextView(getActivity());
        tv.setText("Screen " + getArguments().getInt(MainActivity.key_screen_number));
        tv.setTextSize(30);
        return tv;
    }
}
вылетает при запуске с такими логами.

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

03-28 10:32:12.472: D/AndroidRuntime(336): Shutting down VM
03-28 10:32:12.482: W/dalvikvm(336): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-28 10:32:12.502: E/AndroidRuntime(336): FATAL EXCEPTION: main
03-28 10:32:12.502: E/AndroidRuntime(336): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mafiatabs/com.example.mafiatabs.MainActivity}: java.lang.NullPointerException
03-28 10:32:12.502: E/AndroidRuntime(336): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at android.os.Looper.loop(Looper.java:123)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at java.lang.reflect.Method.invokeNative(Native Method)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at java.lang.reflect.Method.invoke(Method.java:507)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at dalvik.system.NativeStart.main(Native Method)
03-28 10:32:12.502: E/AndroidRuntime(336): Caused by: java.lang.NullPointerException
03-28 10:32:12.502: E/AndroidRuntime(336): 	at com.example.mafiatabs.MainActivity.onCreate(MainActivity.java:26)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-28 10:32:12.502: E/AndroidRuntime(336): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-28 10:32:12.502: E/AndroidRuntime(336): 	... 11 more


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

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение Foenix » 28 мар 2014, 15:22

и что?
щелкай сюда
at com.example.mafiatabs.MainActivity.onCreate(MainActivity.java:26)
ищи что у тебя там не находится
R.id.team

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

volboy
Сообщения: 39
Зарегистрирован: 11 ноя 2013, 17:08

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение volboy » 29 мар 2014, 10:10

Разобрался, сделал немного по другому.

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

package com.example.mafiatabss;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.Tab;
import android.support.v7.app.ActionBarActivity;
import android.widget.Toast;



public class MainActivity extends ActionBarActivity {
	    ActionBar bar;
	  
        final String LOG_TAG = "myLogs";

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   
    bar = getSupportActionBar();

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
    
    bar.addTab(bar.newTab()
            .setText("Simple")
            .setTabListener(new TabListener<Fragment1>(
                    this, "simple", Fragment1.class)));
    bar.addTab(bar.newTab()
            .setText("Contacts")
            .setTabListener(new TabListener<Fragment2>(
                    this, "contacts", Fragment2.class)));
    if (savedInstanceState != null) {
        bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
    }
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
      outState.putInt("tab",  getSupportActionBar().getSelectedNavigationIndex());
  }

  public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
      private final Activity mActivity;
      private final String mTag;
      private final Class<T> mClass;
      private final Bundle mArgs;
      private Fragment mFragment;

      public TabListener(Activity activity, String tag, Class<T> clz) {
          this(activity, tag, clz, null);
      }

      public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
          mActivity = activity;
          mTag = tag;
          mClass = clz;
          mArgs = args;

          // Check to see if we already have a fragment for this tab, probably
          // from a previously saved state.  If so, deactivate it, because our
          // initial state is that a tab isn't shown.
          mFragment = ((FragmentActivity) mActivity).getSupportFragmentManager().findFragmentByTag(mTag);
          if (mFragment != null && !mFragment.isDetached()) {
              FragmentTransaction ft = ((FragmentActivity) mActivity).getSupportFragmentManager().beginTransaction();
              ft.detach(mFragment);
              ft.commit();
          }
      }

      public void onTabSelected(Tab tab, FragmentTransaction ft) {
          if (mFragment == null) {
              mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
              ft.add(android.R.id.content, mFragment, mTag);
          } else {
              ft.attach(mFragment);
          }
      }

      public void onTabUnselected(Tab tab, FragmentTransaction ft) {
          if (mFragment != null) {
              ft.detach(mFragment);
          }
      }

      public void onTabReselected(Tab tab, FragmentTransaction ft) {
          Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show();
      }
  }
}


Вопрос как прикрутить сюда свайп, чтоб вкладки перелистывать.

AlexVinn
Сообщения: 81
Зарегистрирован: 04 апр 2014, 04:56

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение AlexVinn » 02 май 2014, 12:34

У меня тоже такой вопрос.
Вопрос как прикрутить сюда свайп, чтоб вкладки перелистывать.
volboy писал(а):Разобрался, сделал немного по другому.

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

package com.example.mafiatabss;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.Tab;
import android.support.v7.app.ActionBarActivity;
import android.widget.Toast;



public class MainActivity extends ActionBarActivity {
	    ActionBar bar;
	  
        final String LOG_TAG = "myLogs";

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   
    bar = getSupportActionBar();

    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
    
    bar.addTab(bar.newTab()
            .setText("Simple")
            .setTabListener(new TabListener<Fragment1>(
                    this, "simple", Fragment1.class)));
    bar.addTab(bar.newTab()
            .setText("Contacts")
            .setTabListener(new TabListener<Fragment2>(
                    this, "contacts", Fragment2.class)));
    if (savedInstanceState != null) {
        bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
    }
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
      outState.putInt("tab",  getSupportActionBar().getSelectedNavigationIndex());
  }

  public static class TabListener<T extends Fragment> implements ActionBar.TabListener {
      private final Activity mActivity;
      private final String mTag;
      private final Class<T> mClass;
      private final Bundle mArgs;
      private Fragment mFragment;

      public TabListener(Activity activity, String tag, Class<T> clz) {
          this(activity, tag, clz, null);
      }

      public TabListener(Activity activity, String tag, Class<T> clz, Bundle args) {
          mActivity = activity;
          mTag = tag;
          mClass = clz;
          mArgs = args;

          // Check to see if we already have a fragment for this tab, probably
          // from a previously saved state.  If so, deactivate it, because our
          // initial state is that a tab isn't shown.
          mFragment = ((FragmentActivity) mActivity).getSupportFragmentManager().findFragmentByTag(mTag);
          if (mFragment != null && !mFragment.isDetached()) {
              FragmentTransaction ft = ((FragmentActivity) mActivity).getSupportFragmentManager().beginTransaction();
              ft.detach(mFragment);
              ft.commit();
          }
      }

      public void onTabSelected(Tab tab, FragmentTransaction ft) {
          if (mFragment == null) {
              mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
              ft.add(android.R.id.content, mFragment, mTag);
          } else {
              ft.attach(mFragment);
          }
      }

      public void onTabUnselected(Tab tab, FragmentTransaction ft) {
          if (mFragment != null) {
              ft.detach(mFragment);
          }
      }

      public void onTabReselected(Tab tab, FragmentTransaction ft) {
          Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show();
      }
  }
}


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

Sasha
Сообщения: 2
Зарегистрирован: 15 июл 2014, 11:44

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение Sasha » 20 июл 2014, 10:57

не работает иконка на android 4.4.2?

GRAF_COLLIOSTRO
Сообщения: 115
Зарегистрирован: 08 янв 2015, 14:32

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение GRAF_COLLIOSTRO » 28 янв 2015, 14:51

корочь каша
Сделал урок. Во второй вкладке нет картинки. Менял темы, менял API эмулятора. Результаты противоречивые: картинка то есть, то нет... то перекособочена(((
запилил к себе на телефон. Потухшая звезда отображается криво( В остальном всё работает.
Но чегойто не нравится мне этот метод( Не удивлюсь если половина пользователей не увидит того, что было задумано разработчиками...
пойду мучать ActionBar

burnix
Сообщения: 4
Зарегистрирован: 21 май 2015, 14:53

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение burnix » 07 июл 2015, 20:09

Как сделать индикатор картинкой без текста? Если прописывать null, то остается пустое место, а если прописывать только путь к рисунку, то Android Studio ругается.

И есть ли смысл работать с Tab? Или просто забивать и приступать к изучению actionBar?

burnix
Сообщения: 4
Зарегистрирован: 21 май 2015, 14:53

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение burnix » 08 июл 2015, 00:13

Отвечаю сам себе. Action Bar тоже устарел. Те, кто дошел до этого сообщения - проходим тему ViewPager

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

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение K_Vladimir » 22 июл 2015, 14:02

У меня тоже картинка не появляется.
tabSpec.setIndicator("Вкладка 2", getResources().getDrawable(R.drawable.tab_icon_selector));
Перепробовал всё что можно. Пробовал картинку напрямую без xml. Менял depricated методы на новые.
Два дня бился с этим, так и не отображается ((((((((((((((((
Где звезда?!!!

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

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение klblk » 22 июл 2015, 15:10

K_Vladimir писал(а):У меня тоже картинка не появляется.
tabSpec.setIndicator("Вкладка 2", getResources().getDrawable(R.drawable.tab_icon_selector));
Перепробовал всё что можно. Пробовал картинку напрямую без xml. Менял depricated методы на новые.
Два дня бился с этим, так и не отображается ((((((((((((((((
Где звезда?!!!
В Android 3 и выше иконки для табов не отображаются. Если очень нужно, то ищите стороннее решение.

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

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение Foenix » 23 июл 2015, 12:30

K_Vladimir писал(а):У меня тоже картинка не появляется.
tabSpec.setIndicator("Вкладка 2", getResources().getDrawable(R.drawable.tab_icon_selector));
Перепробовал всё что можно. Пробовал картинку напрямую без xml. Менял depricated методы на новые.
Два дня бился с этим, так и не отображается ((((((((((((((((
Где звезда?!!!
не нужно стороннее решение. Используй новый TabLayout - там есть и иконки, и текст и прочее. И реализовывается все проще, чем раньше.
R.id.team

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

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

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение Foenix » 23 июл 2015, 12:33

[syntax=xml]<android.support.design.widget.TabLayout
android:id="@+id/tlUserProfileTabs"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="?attr/colorAccent"
app:tabGravity="fill"
app:tabIndicatorColor="#5be5ad"
app:tabIndicatorHeight="4dp"
app:tabMode="fixed" />[/syntax]

[syntax=java5]private void setupTabs() {
tlUserProfileTabs.addTab(tlUserProfileTabs.newTab().setIcon(R.drawable.ic_grid_on_white));
tlUserProfileTabs.addTab(tlUserProfileTabs.newTab().setIcon(R.drawable.ic_list_white));
tlUserProfileTabs.addTab(tlUserProfileTabs.newTab().setIcon(R.drawable.ic_place_white));
tlUserProfileTabs.addTab(tlUserProfileTabs.newTab().setIcon(R.drawable.ic_label_white));
}[/syntax]

https://gist.github.com/frogermcs/63ae8 ... ayout-java
R.id.team

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

rePlay
Сообщения: 7
Зарегистрирован: 11 июл 2015, 17:54

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение rePlay » 25 июл 2015, 17:49

Не знаю, что у вас за проблемы. У меня нормально иконка отображается в заголовке вкладки.
По умолчанию для для приложения стоит тема AppTheme, а конкретно Theme.AppCompat.Light.
Если поставить стандартную тему, например, Theme.Black или Theme.Light (другие не пробовал), то всё нормально отображается.

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

Re: Урок 76. Tab - вкладки. Общий обзор

Сообщение Foenix » 25 июл 2015, 22:28

rePlay, лучше все же использовать новые компоненты
R.id.team

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

Ответить