4547


お世話になります。

Android の勉強を再開して、手始めに Fragment
を使ってみようと思い、このページ「[AndroidStudioの標準デザインパターンで分かるFragment入門](http://qiita.com/Hoshi_7/items/bee2588397348a4e0105)」でトライしてるのですが、うまく行かず、質問させていただきました。

[code]

    unfortunately アプリ名 has stopped
    
[/code]

logcat にもなんのエラーも出ないので、どうしたものかと思っております。

関係ありそうなソースも記載しておきます。

[code]

    package jp.co.shiratsu.testfragment;
    
    import android.app.Activity;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    
    /**
     * A simple {@link Fragment} subclass.
     * Activities that contain this fragment must implement the
     * {@link ImageFragment.OnFragmentInteractionListener} interface
     * to handle interaction events.
     * Use the {@link ImageFragment#newInstance} factory method to
     * create an instance of this fragment.
     */
    public class ImageFragment extends Fragment {
        // TODO: Rename parameter arguments, choose names that match
        // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
        private static final String ARG_PARAM_RESOURCE_ID = "resource_id";
        private int mResourceId;
    
        private OnFragmentInteractionListener mListener;
    
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param resourceId
         * @return A new instance of fragment ImageFragment.
         */
        // TODO: Rename and change types and number of parameters
        public static ImageFragment newInstance(int resourceId) {
            ImageFragment fragment = new ImageFragment();
            Bundle args = new Bundle();
            args.putInt(ARG_PARAM_RESOURCE_ID, resourceId);
            fragment.setArguments(args);
            return fragment;
        }
    
        public ImageFragment() {
            // Required empty public constructor
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getArguments() != null) {
                mResourceId = getArguments().getInt(ARG_PARAM_RESOURCE_ID);
            }
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View rootView = inflater.inflate(R.layout.fragment_image, container, false);
    
            ImageView imageView = (ImageView)rootView.findViewById(R.id.image_view);
            imageView.setImageResource(mResourceId);
    
            return rootView;
        }
    
        // TODO: Rename method, update argument and hook method into UI event
        public void onButtonPressed(Uri uri) {
            if (mListener != null) {
                mListener.onFragmentInteraction(uri);
            }
        }
    
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            try {
                mListener = (OnFragmentInteractionListener) activity;
            } catch (ClassCastException e) {
                throw new ClassCastException(activity.toString()
                        + " must implement OnFragmentInteractionListener");
            }
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
            mListener = null;
        }
    
        /**
         * This interface must be implemented by activities that contain this
         * fragment to allow an interaction in this fragment to be communicated
         * to the activity and potentially other fragments contained in that
         * activity.
         * <p/>
         * See the Android Training lesson <a href=
         * "http://developer.android.com/training/basics/fragments/communicating.html"
         * >Communicating with Other Fragments</a> for more information.
         */
        public interface OnFragmentInteractionListener {
            // TODO: Update argument type and name
            public void onFragmentInteraction(Uri uri);
        }
    
    
    }
    
[/code]

[code]

    package jp.co.shiratsu.testfragment;
    
    import android.app.Activity;
    import android.net.Uri;
    import android.support.v7.app.ActionBarActivity;
    import android.support.v7.app.ActionBar;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.content.Context;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.support.v4.widget.DrawerLayout;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class MainActivity extends ActionBarActivity
            implements NavigationDrawerFragment.NavigationDrawerCallbacks{
    
        /**
         * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
         */
        private NavigationDrawerFragment mNavigationDrawerFragment;
    
        /**
         * Used to store the last screen title. For use in {@link #restoreActionBar()}.
         */
        private CharSequence mTitle;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mNavigationDrawerFragment = (NavigationDrawerFragment)
                getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
            mTitle = getTitle();
    
            // Set up the drawer.
            mNavigationDrawerFragment.setUp(
                    R.id.navigation_drawer,
                    (DrawerLayout) findViewById(R.id.drawer_layout));
        }
    
        @Override
        public void onNavigationDrawerItemSelected(int position) {
            // update the main content by replacing fragments
            FragmentManager fragmentManager = getSupportFragmentManager();
            if(position == 0){
                fragmentManager.beginTransaction()
                        .replace(R.id.container, ImageFragment.newInstance(R.drawable.yukiyama))
                        .commit();
            }else{
                fragmentManager.beginTransaction()
                        .replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
                        .commit();
            }
    
    
        }
    
        public void onSectionAttached(int number) {
            switch (number) {
                case 1:
                    mTitle = getString(R.string.title_section1);
                    break;
                case 2:
                    mTitle = getString(R.string.title_section2);
                    break;
                case 3:
                    mTitle = getString(R.string.title_section3);
                    break;
            }
        }
    
        public void restoreActionBar() {
            ActionBar actionBar = getSupportActionBar();
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
            actionBar.setDisplayShowTitleEnabled(true);
            actionBar.setTitle(mTitle);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            if (!mNavigationDrawerFragment.isDrawerOpen()) {
                // Only show items in the action bar relevant to this screen
                // if the drawer is not showing. Otherwise, let the drawer
                // decide what to show in the action bar.
                getMenuInflater().inflate(R.menu.main, menu);
                restoreActionBar();
                return true;
            }
            return super.onCreateOptionsMenu(menu);
        }
    
        @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);
        }
    
        /**
         * A placeholder fragment containing a simple view.
         */
        public static class PlaceholderFragment extends Fragment {
            /**
             * The fragment argument representing the section number for this
             * fragment.
             */
            private static final String ARG_SECTION_NUMBER = "section_number";
    
            /**
             * Returns a new instance of this fragment for the given section
             * number.
             */
            public static PlaceholderFragment newInstance(int sectionNumber) {
                PlaceholderFragment fragment = new PlaceholderFragment();
                Bundle args = new Bundle();
                args.putInt(ARG_SECTION_NUMBER, sectionNumber);
                fragment.setArguments(args);
                return fragment;
            }
    
            public PlaceholderFragment() {
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_main, container, false);
                return rootView;
            }
    
            @Override
            public void onAttach(Activity activity) {
                super.onAttach(activity);
                ((MainActivity) activity).onSectionAttached(
                        getArguments().getInt(ARG_SECTION_NUMBER));
            }
        }
    
    }
    
[/code]

[code]

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="jp.co.shiratsu.testfragment" >
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
[/code]

よろしくお願い致します。


CC BY-SA 3.0
2015-01-14T08:28:25.627
4542
2015-01-14T10:10:16.700
2015-01-14T09:34:49.080
4978
403
question
android java android-fragments
Fragment のアプリがすぐに落ちてしまう


下記のURL先に記載されているようにsetContentView()に問題がありそうですね。

[http://webcache.googleusercontent.com/search?q=cache:pVjYhUAaDtwJ:qiita.com/little/items/a14298ded25246c3de8f+&cd=1&hl=ja&ct=clnk&gl=jp](http://webcache.googleusercontent.com/search?q=cache:pVjYhUAaDtwJ:qiita.com/little/items/a14298ded25246c3de8f+&cd=1&hl=ja&ct=clnk&gl=jp)

追記  
AcitvityのsetContentView()に設定するレイアウトファイルは合ってますね。失礼しました。


CC BY-SA 3.0
2015-01-14T08:50:35.660
4543
2015-01-14T10:10:16.700
2015-01-14T10:10:16.700
3488
3488
4542
answer


`MainActivity` が `OnFragmentInteractionListener` を実装していないからではないでしょうか。

[code]

    public class MainActivity extends ActionBarActivity
    implements NavigationDrawerFragment.NavigationDrawerCallbacks{
    
[/code]

ご自身で以下のように書かれているので、`MainActivity` は `OnFragmentInteractionListener`
を実装しないといけないと思います。

[code]

    try {
        mListener = (OnFragmentInteractionListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnFragmentInteractionListener");
    }
    
[/code]

`logcat` で見ると、以下のような `ClassCastException` エラーが出ていました。

[code]

     01-14 18:38:49.952 E/AndroidRuntime(29904): Caused by: java.lang.ClassCastException: jp.co.shiratsu.testfragment.MainActivity@41a24a28 must implement OnFragmentInteractionListener
     01-14 18:38:49.952 E/AndroidRuntime(29904):     at jp.co.shiratsu.testfragment.ImageFragment.onAttach(ImageFragment.java:80)
     01-14 18:38:49.952 E/AndroidRuntime(29904):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:903)
     01-14 18:38:49.952 E/AndroidRuntime(29904):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
     01-14 18:38:49.952 E/AndroidRuntime(29904):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
     01-14 18:38:49.952 E/AndroidRuntime(29904):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
     01-14 18:38:49.952 E/AndroidRuntime(29904):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548)
     01-14 18:38:49.952 E/AndroidRuntime(29904):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1164)
     01-14 18:38:49.952 E/AndroidRuntime(29904):     at android.app.Activity.performStart(Activity.java:5114)
     01-14 18:38:49.952 E/AndroidRuntime(29904):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)
    
[/code]


CC BY-SA 3.0
2015-01-14T09:42:49.920
4547
2015-01-14T09:42:49.920
4575
4542
answer