0

Android Studio v3.2 で新しいプロジェクトを作成し、API 18 を使用して、デフォルトのアプリを正常に作成しました。

ファイルにスピナーを追加しましたfragment(初めて使用するので、これが問題かどうかわかりません)。

いいえ、その場でスピナーにいくつかのダミーアイテムを追加したかっただけですが、私のアプリは Unofrotunately でクラッシュし続けます....停止したというメッセージが表示されます。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_app_start);

        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment())
                    .commit();
        }
    //Just added this!
    String[] movies = new String[]{"one, two, three"};
    ArrayAdapter<String> movieAdapter = new ArrayAdapter<String>(this, R.id.app_start_select_movie_spinner, movies );
    Spinner spinner = (Spinner)findViewById(R.id.app_start_select_movie_spinner);
    spinner.setAdapter(movieAdapter);
}

logcat のメッセージは次のとおりです。

11-06 23:57:29.174  16743-16743/org.pervasivesystems.nexusmosaic E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{org.pervasivesystems.nexusmosaic/org.pervasivesystems.nexusmosaic.activity_app_start}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at org.pervasivesystems.nexusmosaic.activity_app_start.onCreate(activity_app_start.java:32)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5103)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
            at dalvik.system.NativeStart.main(Native Method)

32行目は次のとおりです。

spinner.setAdapter(movieAdapter);

したがって、基本的にspinnerはnullです...どういうわけか割り当てられませんでした

それは非常に単純かもしれませんが、私はそれを理解できませんでした:(

4

1 に答える 1

2

スピナーとアダプター スピナー項目の両方に同じリソースを使用しています (ビュー オブジェクトではなく、レイアウト リソース ファイルへのポインターが必要です)。

ArrayAdapter<String> movieAdapter = new ArrayAdapter<String>(this, R.id.app_start_select_movie_spinner, movies );
Spinner spinner = (Spinner)findViewById(R.id.app_start_select_movie_spinner);

代わりに、次を試してください。

ArrayAdapter<String> movieAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, movies );
Spinner spinner = (Spinner)findViewById(R.id.app_start_select_movie_spinner);

また、アダプターの初期化をフラグメントの onCreateView に移動してみてください。

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

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

        String[] movies = new String[]{"one, two, three"};
        ArrayAdapter<String> movieAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, movies );
        Spinner spinner = (Spinner)rootView.findViewById(R.id.app_start_select_movie_spinner);
        spinner.setAdapter(movieAdapter);
        return rootView;
}

アクティビティからフラグメントにアクセスするには、fragment google dev docsを参照してください。

本質的には、次のコードを使用してアクティビティからフラグメントのルート ビューを取得できますが、少しうまくいかない場合があります。

YourFragment yourFragment = (YourFragment) getFragmentManager().findViewById(R.id.your_fragment);
if(yourFragment != null)
{
    View fragmentRootView = (View) yourFragment.getView();
    //do your manipulation here.
}
于 2013-11-07T00:04:21.530 に答える