0

I have already read a lot about this exception on stackoverflow(if you are here for the same reason, you can check for hints this, this or this). My application behaves properly in portrait mode, but in landscape I get this error. According to other posts, reason can vary. A popular way is to use Support Library, but I'm not sure that this is solution since my minSDK=15.

My trace

3799-3799 E: FATAL EXCEPTION: main
3799-3799 E: Process: com.githublist1, PID: 3799
3799-3799 E: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.githublist1/com.githublist1.MainActivity}: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
3799-3799 E:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
3799-3799 E:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
3799-3799 E:     at android.app.ActivityThread.access$800(ActivityThread.java:135)
3799-3799 E:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
3799-3799 E:     at android.os.Handler.dispatchMessage(Handler.java:102)
3799-3799 E:     at android.os.Looper.loop(Looper.java:136)
3799-3799 E:     at android.app.ActivityThread.main(ActivityThread.java:5001)
3799-3799 E:     at java.lang.reflect.Method.invokeNative(Native Method)
3799-3799 E:     at java.lang.reflect.Method.invoke(Method.java:515)
3799-3799 E:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
3799-3799 E:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
3799-3799 E:     at dalvik.system.NativeStart.main(Native Method)
3799-3799 E:  Caused by: android.view.InflateException: Binary XML file line #8: Error inflating class fragment
3799-3799 E:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
3799-3799 E:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
3799-3799 E:     at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
3799-3799 E:     at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
3799-3799 E:     at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
3799-3799 E:     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
3799-3799 E:     at android.app.Activity.setContentView(Activity.java:1929)
3799-3799 E:     at com.githublist1.MainActivity.onCreate(MainActivity.java:42)
3799-3799 E:     at android.app.Activity.performCreate(Activity.java:5231)
3799-3799 E:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
3799-3799 E:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
3799-3799 E:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
3799-3799 E:     at android.app.ActivityThread.access$800(ActivityThread.java:135) 
3799-3799 E:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
3799-3799 E:     at android.os.Handler.dispatchMessage(Handler.java:102) 
3799-3799 E:     at android.os.Looper.loop(Looper.java:136) 
3799-3799 E:     at android.app.ActivityThread.main(ActivityThread.java:5001) 
3799-3799 E:     at java.lang.reflect.Method.invokeNative(Native Method) 
3799-3799 E:     at java.lang.reflect.Method.invoke(Method.java:515) 
3799-3799 E:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
3799-3799 E:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
3799-3799 E:     at dalvik.system.NativeStart.main(Native Method) 
3799-3799 E:  Caused by: java.lang.NullPointerException
3799-3799 E:     at com.githublist1.RepoListFragment.onCreate(RepoListFragment.java:64)
3799-3799 E:     at android.app.Fragment.performCreate(Fragment.java:1678)
3799-3799 E:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:859)
3799-3799 E:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1040)
3799-3799 E:     at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1142)
3799-3799 E:     at android.app.Activity.onCreateView(Activity.java:4786)
3799-3799 E:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689)
3799-3799 E:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
3799-3799 E:     at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
3799-3799 E:     at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
3799-3799 E:     at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
3799-3799 E:     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290) 
3799-3799 E:     at android.app.Activity.setContentView(Activity.java:1929) 
3799-3799 E:     at com.githublist1.MainActivity.onCreate(MainActivity.java:42) 
3799-3799 E:     at android.app.Activity.performCreate(Activity.java:5231) 
3799-3799 E:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
3799-3799 E:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 
3799-3799 E:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
3799-3799 E:     at android.app.ActivityThread.access$800(ActivityThread.java:135) 
3799-3799 E:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
3799-3799 E:     at android.os.Handler.dispatchMessage(Handler.java:102) 
3799-3799 E:     at android.os.Looper.loop(Looper.java:136) 
3799-3799 E:     at android.app.ActivityThread.main(ActivityThread.java:5001) 
3799-3799 E:     at java.lang.reflect.Method.invokeNative(Native Method) 
3799-3799 E:     at java.lang.reflect.Method.invoke(Method.java:515) 
3799-3799 E:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
3799-3799 E:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
3799-3799 E:     at dalvik.system.NativeStart.main(Native Method) 

activity_main.xml Portrait

 <?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

activity_main.xml Landscape

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <fragment
        android:name="com.githublist1.RepoListFragment"
        android:id="@+id/fragment_list"
        android:layout_weight="3"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        tools:layout="@layout/fragment_repolist_list"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    </fragment>

    <fragment
        android:name="com.githublist1.RepoDetailFragment"
        android:id="@+id/fragment_detail"
        android:layout_weight="4"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        tools:layout="@layout/fragment_repolist_detail">
    </fragment>
</LinearLayout>

MainActivity

public class MainActivity extends Activity{

    static List<Repository> repositoriesList;
    RepositoryDataSource repoDS;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //// TODO: 25.11.2015 Delete this part after async impl
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        retriveRepo();

        setContentView(R.layout.activity_main);
        if (findViewById(R.id.fragment_container) != null) {


            RepoListFragment firstFragment = new RepoListFragment();
            // Configure transaction
            Bundle args = new Bundle();
            args.putParcelableArrayList(RepoListFragment.ARG_PARAM1, (ArrayList<? extends Parcelable>) repositoriesList);

            firstFragment.setArguments(args);
            FragmentManager fragMan = getFragmentManager();
            FragmentTransaction transaction = fragMan.beginTransaction();
            transaction.add(R.id.fragment_container, firstFragment);

            // Commit the transaction
            transaction.commit();

        }

    }

    void onRepositorySelected(int position) {
        // Capture the article fragment from the activity layout
        RepoDetailFragment detailFragment = (RepoDetailFragment)
                getFragmentManager().findFragmentById(R.id.fragment_detail);
        Repository repositorySelected = repositoriesList.get(position);
        Log.i("onRepositorySelected",repositorySelected.toString());

        if (detailFragment != null) {
            // If article frag is available - in two-pane layout...

            // Call a method in the RepoDetailFragment to update its content

            detailFragment.updateDetailsView(repositorySelected);

        } else {
            // If the frag is not available, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected article
            RepoDetailFragment newFragment = new RepoDetailFragment();
            Bundle args = new Bundle();      // Transports position to newly created fragment

            args.putParcelable(RepoDetailFragment.REPOSITORY_SELECTED, repositorySelected);
            newFragment.setArguments(args);

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }

RepoListFragment

public class RepoListFragment extends ListFragment {

    static final String ARG_PARAM1 = "param1";
    private ArrayList<Repository> repolist;
    MainActivity mCallback;
    private GitHubAdapter mAdapter;
 @Override
    public void onCreate(Bundle savedInstanceState) {/////////////////////////////////////////////////////////////////////////////
        super.onCreate(savedInstanceState);
        //// TODO: 28.11.2015 check it!
        repolist = getArguments().getParcelableArrayList(ARG_PARAM1);
        // TODO: Change Adapter to display your content
        for (Repository repository : repolist) {
            Log.i("Get in fragment", repository.toString());
        }

        mAdapter = new GitHubAdapter(getActivity(), repolist);
        // Set the adapter
        setListAdapter(mAdapter);

    }


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

        // When in two-pane layout, set the listview to highlight the selected list item
        // (We do this during onStart because at the point the listview is available.)
        if (getFragmentManager().findFragmentById(R.id.fragment_detail) != null) {
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        }
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mCallback = (MainActivity) activity;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_repolist, container, false);

        return view;
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Notify the parent activity of selected item
        mCallback.onRepositorySelected(position);

        // Set the item as checked to be highlighted when in two-pane layout
        getListView().setItemChecked(position, true);
    }

RepoDetailFragment

public class RepoDetailFragment extends Fragment {
    final static String REPOSITORY_SELECTED = "repositoryDetails";
    Repository currentRepository = null;

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

        // If activity recreated (such as from screen rotate), restore
        // the previous article selection set by onSaveInstanceState().
        // This is primarily necessary when in the two-pane layout.
        if (savedInstanceState != null) {
            currentRepository = savedInstanceState.getParcelable(REPOSITORY_SELECTED);
        }

        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_repolist_detail, container, false);
    }


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

        // During startup, check if there are arguments passed to the fragment.
        // onStart is a good place to do this because the layout has already been
        // applied to the fragment at this point so we can safely call the method
        // below that sets the article text.
        Bundle args = getArguments();
        if (args != null) {
            // Set article based on argument passed in
            updateDetailsView((Repository) args.getParcelable(REPOSITORY_SELECTED));
        } else if (currentRepository != null) {
            // Set article based on saved instance state defined during onCreateView
            updateDetailsView(currentRepository);
        }
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////

    public void updateDetailsView(Repository repository) {
        currentRepository = repository;
        TextView fullName = (TextView) getActivity().findViewById(R.id.full_name);
        TextView description = (TextView) getActivity().findViewById(R.id.description);
        TextView language = (TextView) getActivity().findViewById(R.id.language);
        TextView url = (TextView) getActivity().findViewById(R.id.url);

        fullName.setText(repository.getFull_name());
        description.setText(repository.getDescription());
        language.setText(repository.getLanguage());
        url.setText(repository.getHtml_url());
    }

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        // Save the current repo selection in case we need to recreate the fragment
        outState.putParcelable(REPOSITORY_SELECTED, currentRepository);
    }
Community
  • 1
  • 1
Autumn_Cat
  • 790
  • 1
  • 14
  • 28

1 Answers1

0

Problem was in attempt to get Views with help of getActivity().findViewById(...) . I used code example based on Support Library which doesn't have getView() method. Using getView() solved problem.

Autumn_Cat
  • 790
  • 1
  • 14
  • 28