1

アダプターを設定している行 (mGrid.setAdapter(new AppsAdapter()); で) でヌル ポインター例外が発生しています。アプリ ドロワー (および [設定] のアプリ リスト) にあるアプリ アイコンであるアイコンのグリッド。

フラグメントのコードは次のとおりです。

public class Tab3_fragment extends Fragment {

GridView mGrid;
private List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    return inflater.inflate(R.layout.tabfragment3, container, false);

}

@Override
public void onStart() {
    super.onStart();

    loadApps();
    mGrid = (GridView) getActivity().findViewById(R.id.myGrid);
    mGrid.setAdapter(new AppsAdapter());

}

@Override
public void onResume() {
    super.onResume();
    loadApps();
}

private void loadApps() {
    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    mApps = getActivity().getPackageManager().queryIntentActivities(mainIntent, 0);
}

public class AppsAdapter extends BaseAdapter {
    public AppsAdapter() {
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView i;

        if (convertView == null) {
            i = new ImageView(getActivity().getApplicationContext());
            i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            i.setLayoutParams(new GridView.LayoutParams(50, 50));
        } else {
            i = (ImageView) convertView;
        }

        ResolveInfo info = mApps.get(position);
        i.setImageDrawable(info.activityInfo.loadIcon(getActivity().getPackageManager()));

        return i;
    }


    public final int getCount() {
        return mApps.size();
    }

    public final Object getItem(int position) {
        return mApps.get(position);
    }

    public final long getItemId(int position) {
        return position;
    }
  } 
}

レイアウトのコードは次のとおりです (scrollView 内の「tab3fragment.xml」に含まれています)。

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/myGrid"
android:layout_width="match_parent" 
android:layout_height="match_parent"
android:padding="10dp"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:numColumns="3"
android:columnWidth="60dp"
android:stretchMode="columnWidth"

android:gravity="center"
/>

2 番目のタブ (3 つのうち) にスワイプすると、突然クラッシュし、次のエラーが表示されます。

04-27 21:31:51.337: D/libEGL(16874): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
04-27 21:31:51.369: D/libEGL(16874): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
04-27 21:31:51.369: D/libEGL(16874): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
04-27 21:31:51.627: D/OpenGLRenderer(16874): Enabling debug mode 0
04-27 21:31:51.634: I/Choreographer(16874): Skipped 110 frames!  The application may be doing too much work on its main thread.
04-27 21:32:22.994: D/AndroidRuntime(16874): Shutting down VM
04-27 21:32:22.994: W/dalvikvm(16874): threadid=1: thread exiting with uncaught exception (group=0x41c92930)
04-27 21:32:23.009: E/AndroidRuntime(16874): FATAL EXCEPTION: main
04-27 21:32:23.009: E/AndroidRuntime(16874): java.lang.NullPointerException
04-27 21:32:23.009: E/AndroidRuntime(16874):    at com.rdx.themetesterplus.Tab3_fragment.onStart(Tab3_fragment.java:36)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.app.Fragment.performStart(Fragment.java:1484)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:941)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:807)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.app.FragmentManagerImpl.startPendingDeferredFragments(FragmentManager.java:1112)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1461)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.view.ViewPager.populate(ViewPager.java:881)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.support.v4.view.ViewPager$3.run(ViewPager.java:237)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.view.Choreographer.doCallbacks(Choreographer.java:562)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.view.Choreographer.doFrame(Choreographer.java:531)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.os.Handler.handleCallback(Handler.java:725)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.os.Looper.loop(Looper.java:137)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at android.app.ActivityThread.main(ActivityThread.java:5226)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at java.lang.reflect.Method.invokeNative(Native Method)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at      java.lang.reflect.Method.invoke(Method.java:511)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
04-27 21:32:23.009: E/AndroidRuntime(16874):    at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

0

それが問題かどうかはわかりませんが、私の理解では、 onStart() と onResume() は Fragment 1のライフサイクルの開始時に次々と発生します。loadApps() がそれぞれで発生することに気付きました。私が知る限り、loadApps() 関数は起動時に 2 回呼び出されます。私が間違っている場合は修正してください。

ビューが最初にセットアップされるまで、mGrid を参照できるかどうかわかりません。通常、ビューが設定されると、findViewByID() メソッドを使用できます。

ソース フラグメント ライフ サイクル ソース

于 2013-04-28T06:42:41.393 に答える
0

入れてみて

loadApps();
mGrid = (GridView) getActivity().findViewById(R.id.myGrid);
mGrid.setAdapter(new AppsAdapter());

onStart() の代わりに onActivityCreated() メソッドでデータ セットアップ コードを使用してください。これで問題が解決するはずです。まだ同じ問題が発生している場合はお知らせください。

于 2013-04-28T06:53:36.057 に答える