2015-08-31 1 views
-1

Я создаю приложение адресной книги, используя вкладки Swipe i.e «ViewPager». Когда я запускаю приложение, он выходит из строя. Я получаю ошибки, которые я не понимаю. Пожалуйста, можете ли я любезно помочь мне с этим? Благодарю.Выполнение фрагмента, содержащего список

Это мой класс Fragm.java Fragment.

package com.rufflez.viewpagerexample; 

import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.support.v4.app.Fragment; 
import android.support.v4.widget.CursorAdapter; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

public class Fragm extends Fragment{ 
private CursorAdapter mAdapter; 
public ListView listView; 
public Cursor cursor; 


public static final String[] FROM = { ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, ContactsContract.Contacts.PHOTO_THUMBNAIL_URI }; 
private static final int[] TO = { R.id.text_name, R.id.contact_thumbnail }; 

int layout = R.layout.contact_list_item; 

private android.content.Context context = getActivity(); 
public View view; 
public static Uri uri; 

// columns requested from the database 
    private static final String[] PROJECTION = { 
     ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.PHOTO_THUMBNAIL_URI, 
     ContactsContract.Contacts.DISPLAY_NAME_PRIMARY, 
     ContactsContract.Contacts.HAS_PHONE_NUMBER, 
     ContactsContract.Contacts.IN_VISIBLE_GROUP 
    }; 

    // this goes in the CursorLoader parameter list, it filters 
    // out only those contacts who have a phone number 
    private static final String SELECTION = 
      ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'"; 

    // Empty public constructor, required by the system 
    public Fragm() {} 

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

    View view = inflater.inflate(R.layout.contact_list_view, 
      container, true); 
    listView = (ListView) view.findViewById(R.id.list); 

    Cursor c = null; // there is no cursor yet 
    int flags = 0; 
    mAdapter = new SimpleCursorAdapter(context, layout, c, FROM, TO, flags); 

    return view; 
} 
} 

Это мой TestFragmentAdapter.java класс

package com.rufflez.viewpagerexample; 

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

import com.viewpagerindicator.IconPagerAdapter; 

public class TestFragmentAdapter extends FragmentPagerAdapter implements  IconPagerAdapter{ 
protected static final String[] CONTENT = new String[] { 
    "This", "Is", "A", "Test" 
}; 

private int mCount = CONTENT.length; 

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

@Override 
public int getIconResId(int index) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

@Override 
public Fragment getItem(int position) { 
    Fragment fragment = new Fragment1(); 
    switch(position){ 
    case 0: 
     fragment = new Fragment1(); 
     break; 
    case 1: 
     fragment = new Fragm(); 
     break; 
    case 2: 
     fragment = new Fragment3(); 
     break; 
    case 3: 
     fragment = new Fragment4(); 
     break; 
    } 
    return fragment; 
} 

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

@Override 
public CharSequence getPageTitle(int position){ 
    String title = ""; 
    switch(position){ 
    case 0: 
     title = "Fragment 1"; 
     break; 
    case 1: 
     title = "Fragment 2"; 
     break; 
    case 2: 
     title = "Fragment 3"; 
     break; 
    case 3: 
     title = "Fragment 4"; 
     break; 
    } 

    return title; 
} 

public void setCount(int count){ 
    if (count > 0 && count < 10){ 
     mCount = count; 
     notifyDataSetChanged(); 
    } 
} 

} 

Это моя ошибка Logcat

08-31 21:42:57.956: E/AndroidRuntime(6614): Process: com.rufflez.viewpagerexample, PID: 6614 
08-31 21:42:57.956: E/AndroidRuntime(6614): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:95) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:89) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at com.rufflez.viewpagerexample.Fragm.onCreateView(Fragm.java:55) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:478) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.view.ViewPager.populate(ViewPager.java:1068) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.view.ViewPager.populate(ViewPager.java:914) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.View.measure(View.java:18580) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:874) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:612) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.View.measure(View.java:18580) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.View.measure(View.java:18580) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:447) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.View.measure(View.java:18580) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5827) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:430) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2897) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.View.measure(View.java:18580) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2248) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1306) 
08-31 21:42:57.956: E/AndroidRuntime(6614):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1548) 
+0

Вы не используете TestFragmentAdapter. Вы используете SimpleCursorAdapter –

+1

Удалите эту строку: 'private android.content.Context context = getActivity();' Он вызывается во время построения, когда фрагмент не привязан к какой-либо операции. 'getActivity()' возвращает возвращаемый объект только после 'onAttach' и перед' onDetach'. Не ставьте контекст в полевую переменную. –

ответ

0

Ваш context является недействительным. Вы должны заполнить его после onAttach. Одним из возможных решений является установка его изнутри вашего метода onCreateView.

Вот ссылка на некоторую информацию о фрагменте и активности жизненных циклах: https://github.com/xxv/android-lifecycle

getActivity() на фрагменте только вернет активность между onAttach и onDetach

0

Вы получаете нулевой указатель из-за то, как вы инициализируется контекст:

private Context context = getActivity(); 

следующая работала бы для деятельности:

private Context context = this; 

Но для фрагмента это будет в начале цикла, поэтому вам нужно будет сделать это после прикрепления фрагмента.

OnCreate() это хорошее место, чтобы сделать это:

private Context context; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    context = getActivity(); 
}