2015-01-14 2 views
0

Когда я пользуюсь домашней кнопкой или переключаюсь на пейзаж, я улавливаю исключение во время выполнения: Невозможно приостановить действие. Исключение нулевого указателя. Помогите пожалуйста.Невозможно приостановить активность. NPE

01-14 09: 23: 49,435: Е/AndroidRuntime (331): неустранимые: Главные 01-14 09: 23: 49,435: Е/AndroidRuntime (331): java.lang.RuntimeException: Не удалось приостановить действие {com.example.actiontest/com.example.actiontest.MainActivity}: java.lang.NullPointerException 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.app. ActivityThread.performPauseActivity (ActivityThread.java:2354) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.app.ActivityThread.performPauseActivity (ActivityThread.java:2311) 01-14 09:23 : 49.435: E/AndroidRuntime (33 1): at android.app.ActivityThread.handlePauseActivity (ActivityThread.java:2291) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.app.ActivityThread.access $ 1700 (ActivityThread.java : 117) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:938) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.os.Handler.dispatchMessage (Handler.java:99) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.os.Looper.loop (Looper. java: 123) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.app.ActivityThread.main (ActivityThread.java:3683) 01-14 09: 23: 49.435: E/An droidRuntime (331): at java.lang.reflect.Method.invokeNative (родной метод) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at java.lang.reflect.Method.invoke (метод .java: 507) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:839) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at dalvik.system.NativeStart.main (родной метод) 01-14 09: 23: 49.435: E/AndroidRuntime (331): вызвано: java.lang.NullPointerException 01-14 09: 23: 49.435: E/AndroidRuntime (331): по адресу android.support.v4.app.FragmentManagerImpl.saveFragmentBasicState (FragmentManager.java:1576) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.support.v4.app.FragmentManagerImpl.saveAllState (FragmentManager.java:1617) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.support.v4.app.FragmentActivity.onSaveInstanceState (FragmentActivity.java:481) 01-14 09:23 : 49.435: E/AndroidRuntime (331): at com.actionbarsherlock.app.SherlockFragmentActivity.onSaveInstanceState (SherlockFragmentActivity.java:126) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.app .Activity.performSaveInstanceState (Activity.java:1037) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at andro id.app.Instrumentation.callActivityOnSaveInstanceState (Instrumentation.java:1181) 01-14 09: 23: 49.435: E/AndroidRuntime (331): at android.app.ActivityThread.performPauseActivity (ActivityThread.java:2336) 01- 14 09: 23: 49.435: E/AndroidRuntime (331): ... 12 еще

Основная информация.Java

package com.example.actiontest; 

import android.os.Bundle; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.ViewPager; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.ActionBar.Tab; 
import com.actionbarsherlock.app.SherlockFragmentActivity; 

public class MainActivity extends SherlockFragmentActivity 
          implements ActionBar.TabListener { 

    private ViewPager viewPager; 
    private TabsPagerAdapter mAdapter; 
    private ActionBar actionBar; 
    // Tab titles 
    private String[] tabs = { "Top Rated", "Games", "Movies" }; 

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

     // Initilization 
     actionBar = getSupportActionBar(); 
     viewPager = (ViewPager) findViewById(R.id.pager); 

     mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

     viewPager.setAdapter(mAdapter); 
     //actionBar.setHomeButtonEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     // Adding Tabs 
     for (String tab_name : tabs) { 
      actionBar.addTab(actionBar.newTab().setText(tab_name) 
        .setTabListener(this)); 
     } 

     /** 
     * on swiping the viewpager make respective tab selected 
     * */ 
     viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageSelected(int position) { 
       // on changing the page 
       // make respected tab selected 
       actionBar.setSelectedNavigationItem(position); 
      } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { 
      } 

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

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction transaction) { 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction transaction) { 
     //mSelected.setText("Selected: " + tab.getText()); 
     viewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction transaction) { 
    } 
} 

TabsPagerAdapter.java

package com.example.actiontest; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

public class TabsPagerAdapter extends FragmentPagerAdapter { 

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

    @Override 
    public Fragment getItem(int index) { 

     switch (index) { 
     case 0: 
      // Top Rated fragment activity 
      return new TopRatedFragment(); 
     case 1: 
      // Top Rated fragment activity 
      return new TopRatedFragment(); 
     case 2: 
      // Top Rated fragment activity 
      return new TopRatedFragment(); 
     } 

     return null; 
    } 

    @Override 
    public int getCount() { 
     // get item count - equal to number of tabs 
     return 3; 
    } 

} 

TopRatedFragment.java

package com.example.actiontest; 

import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import com.actionbarsherlock.app.SherlockFragment; 

public class TopRatedFragment extends SherlockFragment { 

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

     View rootView = inflater.inflate(R.layout.fragment_top_rated, container, false); 

     return rootView; 
    } 
} 
+0

Похоже, что ошибка в SherlockFragmentActivity. Отправьте этот класс, пожалуйста. –

+0

Это класс из библиотеки ActionBarSherlock. –

+0

Исключение отсутствует, когда я добавить следующий код: @Override общественности недействительным onSaveInstanceState (Bundle savedInstanceState) {} Но программа работает не корректно. И у меня есть новое предупреждение: ActivityManager: Warning: активность не началась, текущая задача была перенесена на передний план –

ответ

0

Сделайте TabsPagerAdapter продлить FragmentStatePagerAdapter вместо FragmentPagerAdapter и вы хорошо идти.

+0

Работает. Спасибо. –

+0

Добро пожаловать. Просто отметьте ответ так, как принято, чтобы другие люди, имеющие ту же проблему, знали, что это сработало. – VipulKumar

1

Неверное решение проблемы с FragmentStatePagerAdapter. Android docs четко заявить, что

FragmentStatePagerAdapter является более полезным, когда есть большое количество страниц, больше работать как в виде списка. Когда страницы не видны пользователю , весь их фрагмент может быть уничтожен, сохраняя только сохраненное состояние этого фрагмента . Это позволяет пейджера держаться гораздо меньше памяти, связанной с каждой посещенной страницы по сравнению с FragmentPagerAdapter за счет потенциально более накладных когда это переключения между страницами.

Поскольку у вас есть только три страницы, используя FragmentPagerAdapter.

Ваша проблема, скорее всего, связана с использованием старой версии библиотеки поддержки v4. Для того, чтобы проверить, если это так, просто переопределить метод TopRatedFragment#onSaveInstanceState(), как

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    setUserVisibleHint(true); 
} 

Если это исправляет ваш вопрос, то ваша v4 библиотека поддержки версия имеет следующую ошибку в FragmentManagerImpl#saveFragmentBasicState()

if (!f.mUserVisibleHint) { 
    /* 
    if (result == null) { 
     result = new Bundle(); MISSING! 
    }*/ 
    // Only add this if it's not the default value 
    result.putBoolean(FragmentManagerImpl.USER_VISIBLE_HINT_TAG, f.mUserVisibleHint); 
} 

, который бросает NPE когда result приходит неинициализированным, но он еще putBoolean().

+0

Благодарим вас за ответ. Я не понимаю. Я переименовал FragmentStatePagerAdapter в FragmentPagerAdapter, и предыдущие исключения исчезли. Что случилось? –

+0

Потому что у вас, возможно, все еще есть метод 'onSaveInstanceState()', переопределенный, как вы упомянули в своем последнем комментарии к своему вопросу. Вероятно, он пропускает вызов 'super.onSaveInstanceState()' и, следовательно, пропускает ошибку. –

+0

, но я удалил onSaveInstanceState(). О, я создал новый проект, и проблема вернулась. Что-то не так со старым проектом. –

Смежные вопросы