Урок 108. Android 3. ActionBar. Навигация - табы и выпадающий список

Обсуждение уроков
Аватара пользователя
Yennefer
Сообщения: 18
Зарегистрирован: 02 янв 2015, 17:36

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение Yennefer » 02 фев 2015, 07:42

AKhorevich писал(а):У меня выдает java.lang.NullPointerException. По всей видимости ActionBar bar = getActionBar(); возвращает null. Как это решить?
Может помочь, если вы скопируете сюда полностью код класса, в котором возникает ошибка, и лог с ошибкой.

brooken
Сообщения: 4
Зарегистрирован: 12 фев 2015, 01:24

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение brooken » 12 фев 2015, 10:38

Всем здравствуйте.
Странная у меня ситуация получается. У меня в android studio ошибка у знакомого в Eclipse работает :shock:
Беру код с урока копирую его в MainActivity

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

import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity implements ActionBar.TabListener {

    final String LOG_TAG = "myLogs";

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

        ActionBar bar = getActionBar();

        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        Tab tab = bar.newTab();
        tab.setText("tab1");
        tab.setTabListener(this);
        bar.addTab(tab);

        tab = bar.newTab();
        tab.setText("tab2");
        tab.setTabListener(this);
        bar.addTab(tab);

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        Log.d(LOG_TAG, "reselected tab: " + tab.getText());
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        Log.d(LOG_TAG, "selected tab: " + tab.getText());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        Log.d(LOG_TAG, "unselected tab: " + tab.getText());
    }
}
Файл main.xml без изменений, оставляю стандартный:

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>
Запускаю тестирование, приложение пытается запуститься на телефоне, но ему это не удается с уведомлением "в приложении произошла ошибка"
тестирую на своем HTC ONE X+ версия Android 4.2.2 API 17
В логам выдает вот это:

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

02-12 09:33:35.291  26168-26168/com.example.brook.newnew E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.brook.newnew/com.example.brook.newnew.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2463)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520)
            at android.app.ActivityThread.access$600(ActivityThread.java:162)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1366)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:158)
            at android.app.ActivityThread.main(ActivityThread.java:5751)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.example.brook.newnew.MainActivity.onCreate(MainActivity.java:21)
            at android.app.Activity.performCreate(Activity.java:5165)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1103)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2419)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2520)
            at android.app.ActivityThread.access$600(ActivityThread.java:162)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1366)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:158)
            at android.app.ActivityThread.main(ActivityThread.java:5751)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850)
            at dalvik.system.NativeStart.main(Native Method)

brooken
Сообщения: 4
Зарегистрирован: 12 фев 2015, 01:24

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение brooken » 13 фев 2015, 00:42

Вот решение проблемы о которой я выше писал, может кому понадобится http://stackoverflow.com/questions/2825 ... tactionbar

sabash
Сообщения: 1
Зарегистрирован: 15 мар 2015, 07:36

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение sabash » 15 мар 2015, 07:45

Подскажите пожалуйста, после создания данных табов, как я могу дальше добавлять в них текст/кнопки и т.д..?!

Nikolay
Сообщения: 6
Зарегистрирован: 30 мар 2015, 17:04

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение Nikolay » 08 апр 2015, 10:21

Доброго времени суток,
не запускается первая часть урока, ошибка возникает на строчке
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
Среда разработки Android Studio.

Помогите разобраться в чем может быть проблема?

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

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение Foenix » 08 апр 2015, 10:43

не можем.
R.id.team

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

Pavel-Pugach
Сообщения: 15
Зарегистрирован: 31 мар 2015, 15:17

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение Pavel-Pugach » 22 апр 2015, 12:09

Используй android.support.v7.app.ActionBar вместо обычного. Должно помочь. Вот весь код рабочего активити:

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

public class MainActivity extends ActionBarActivity implements android.support.v7.app.ActionBar.TabListener {

    final String LOG_TAG = "myLogs";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        android.support.v7.app.ActionBar bar = getSupportActionBar();
        bar.setNavigationMode(android.support.v7.app.ActionBar.NAVIGATION_MODE_TABS);
        android.support.v7.app.ActionBar.Tab tab = bar.newTab();
        tab.setText("Tab 1");
        tab.setTabListener(this);
        bar.addTab(tab);


        tab = bar.newTab();
        tab.setText("Tab 2");
        tab.setTabListener(this);
        bar.addTab(tab);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }



    @Override
    public void onTabSelected(android.support.v7.app.ActionBar.Tab tab, android.support.v4.app.FragmentTransaction fragmentTransaction) {
        Log.d(LOG_TAG, "selected tab: " + tab.getText());
    }

    @Override
    public void onTabUnselected(android.support.v7.app.ActionBar.Tab tab, android.support.v4.app.FragmentTransaction fragmentTransaction) {
        Log.d(LOG_TAG, "unselected tab: " + tab.getText());
    }

    @Override
    public void onTabReselected(android.support.v7.app.ActionBar.Tab tab, android.support.v4.app.FragmentTransaction fragmentTransaction) {
        Log.d(LOG_TAG, "reselected tab: " + tab.getText());
    }
}

kunstkamera
Сообщения: 5
Зарегистрирован: 17 июл 2015, 14:17

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение kunstkamera » 02 авг 2015, 02:09

Здравствуйте. В моем приложении 3 таба. За каждый отвечает свой фрагмент.

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

public Fragment getItem(int position) {
            Fragment fragment = null;
            switch(position){
                case 0:
                    fragment = new NetbookFragment();
                    break;
                case 1:
                    fragment = new NotebookFragment();
                    break;
                case 2:
                    fragment = new NotepadFragment();
            }
            return fragment;
        }
Возможно ли для каждого фрагмента поставить someEventListener? Если да - как?

gagarinn
Сообщения: 12
Зарегистрирован: 09 янв 2012, 13:55
Откуда: Харьков

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение gagarinn » 06 авг 2015, 17:46

Привет!
Зашел в тупик. Два дня уже читаю по результаты поиска по actionbar tab fragment savedInstanceState и подобным.
У меня есть MainActivity с 3 закладками в ActionBar.
1 закладка - карта
2 закладка - ListFragment1
3 закладка - ListFragment2

По клику на элементе ListFragment1 я заменяю фрагмент на ListFragment3. И все прекрасно, пока не поворачиваю экран.
При перевороте у меня на 2 закладке отображаются и ListFragment1 и ListFragment3.
Подскажите, пожалуйста, что почитать, посмотреть.

MainActivity как в уроке

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

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

        bar.setDisplayShowTitleEnabled(false);
        bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

            tab = bar.newTab();
            tab.setText(getString(R.string.title_map_activity));
            tab.setTabListener(new MainTabListener<MapFragment>(this, MAP_TAG, MapFragment.class));
            bar.addTab(tab);

            tab = bar.newTab();
            tab.setText(getString(R.string.title_catalog_activity));
            tab.setTabListener(new MainTabListener<CatalogFragment>(this, CATALOG_TAG, CatalogFragment.class));
            bar.addTab(tab);
       
            tab = bar.newTab();
            tab.setText(getString(R.string.title_my_activity));
            tab.setTabListener(new MainTabListener<MyHikesFragment>(this, MYHIKES_TAG, MyHikesFragment.class));
            bar.addTab(tab);

        if (savedInstanceState != null){
            int index = savedInstanceState.getInt("selected_tab_index", 0);
            bar.setSelectedNavigationItem(index);
        }else {
            bar.setSelectedNavigationItem(prefs.getInt("TAB_INDEX", 0));
        }
    }
MainTabListener тоже как в уроке не буду его приводить
CatalogFragment (фрагмент, который на закладке 2)

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

ublic class CatalogFragment extends ListFragment {
  
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        CountryArrayAdapter adapter = new CountryArrayAdapter(getActivity(), countryListGenerator());
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

       CitiesFragment citiesFragment = new CitiesFragment();
        Bundle bundle = new Bundle();
        bundle.putString("COUNTRY", countryListGenerator().get(position).getCountryName());
        citiesFragment.setArguments(bundle);
        FragmentTransaction fragmentTransaction = getActivity().getFragmentManager().beginTransaction();
        fragmentTransaction.remove(this);
        fragmentTransaction.replace(android.R.id.tabcontent, citiesFragment);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();

        Toast.makeText(getActivity(), "position = " + getActivity().getActionBar().getTabAt(1).getText(), Toast.LENGTH_SHORT).show();
    }

 private ArrayList<Country> countryListGenerator (){
      int max = 25;

        ArrayList<Country> countries = new ArrayList<Country>();

        for (int i = 0; i <= max; i ++) {
            Country c = new Country();
            c.setCountryName("Country" + i);
            c.setHikesNumber(i + i +" hikes");
            c.setFlag(getResources().getDrawable(R.drawable.russia));
            countries.add(c);
        }

        return countries;
    }
 }
Кстати, когда делаю только fragmentTransaction.replace(android.R.id.tabcontent, citiesFragment), то "старый" фрагмент остается, по-этому удалил.
Но при повороте экрана я его опять создаю...

shirakz
Сообщения: 9
Зарегистрирован: 23 сен 2015, 20:33

Re: Урок 108. Android 3. ActionBar. Навигация - табы и выпад

Сообщение shirakz » 04 мар 2016, 07:21

У всех у кого выходит ошибка java.lang.NullPointerException на строке
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
надо просто добавить в манифест
android:theme="@android:style/Theme.Holo.Light"
вместо
android:theme="@style/AppTheme"

по крайней мере у меня оно заработало
может быть у меня проблема в том что стоит не чистый андроид, а MIUI 7 - оболочка над 5 андроидом для смартфонов Xiaomi

правда в статусбаре (в самом низу Андроид Студио) выходило предупреждение, что
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
может вернуть java.lang.NullPointerException

Ответить