My App Crashes When I Try Showing A Snackbar - android

I am using Android Studio's navigation drawer activity, and I want a snackbar to appear whenever I click on one of the buttons in the drawer, but when I click on it, the app crashes.
Here is a simplified version of the code run when I click on one of the navigation buttons:
#SuppressWarnings("StatementWithEmptyBody")
#Override
public boolean onNavigationItemSelected(MenuItem item) {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
int id = item.getItemId();
if (id == R.id.nav_playstore) {
Snackbar.make(findViewById(R.id.nav_playstore), "This app is not available on the Play Store yet", Snackbar.LENGTH_LONG).show();
}
I think the problem is that I should replace findViewById(R.id.nav_playstore) with something else, but I'm not sure what I would put there instead. If you need more info, I can give you some. Thanks :)
Edit: Here's the stacktrace:
08-03 10:03:45.658 20870-20870/ca.davesautoservice.davesautoservice E/AndroidRuntime: FATAL EXCEPTION: main
Process: ca.davesautoservice.davesautoservice, PID: 20870
java.lang.NullPointerException
at android.support.design.widget.Snackbar.<init>(Snackbar.java:183)
at android.support.design.widget.Snackbar.make(Snackbar.java:215)
at ca.davesautoservice.davesautoservice.MainActivity.onNavigationItemSelected(MainActivity.java:106)
at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:151)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
at android.support.v7.view.menu.SubMenuBuilder.dispatchMenuItemSelected(SubMenuBuilder.java:84)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:318)
at android.view.View.performClick(View.java:4463)
at android.view.View$PerformClick.run(View.java:18770)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5333)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644)
at dalvik.system.NativeStart.main(Native Method)

Kelvin.
Reading the DOCS, you can see that first parameters is:
View: The view to find a parent from.
So, you should pass any view that you have. This way, snack bar can track and find the parent view.
You probably have any other view in your activity.
You are passing
Snackbar.make(findViewById(R.id.nav_playstore), "This app is not available on the Play Store yet", Snackbar.LENGTH_LONG).show();
However R.id.nav_playstore is the ID a of a menu item (and not a VIEW). This way, findViewById(R.id.nav_playstore) returns NULL.
Change the ID from findViewById(R.id.nav_playstore) to an ID of any other View that you have on current Activity. It can be a TextView, EditText
etc...

Snack bar needs either Cordinator layout's view or FloatingAction Button's view to operate properly and respond accurately.
And you passed nav's id in Snackbar's body.
What to do
1- Wrap layout inside Coordinator Layout assign it an ID and use that view in Snackbar.
2- Pass findViewById of FAB (if exists) then it will show snackbar appropriately.
Snackbar.make(findViewById(R.id.fab), "message", Snackbar.LENGTH_SHORT).show();
Hope it helps.

Related

how to set text in Searchview when listView item is clicked

I am working with SearchView. When I write query in Searchview a list of items(Suggestions list) is apppeared. When i click the list item the text of list item does not show in Searchview. I have tried Suggestion listener but application stops working by this method.how can i show the text of clicked item in SearchView.
Also i have tried setquery() but it only work for first or some items and the is shown is SearchView when i click another item it stops the app.When I remove setQuery() it works fine but the name is not shown in SearchView.
here is some part of code.
CustomAdapter.java
convertView.setOnClickListener(new View.OnClickListener() {
TextView txtView = (TextView) ((MainActivity)c).findViewById(R.id.textView);
#Override
public void onClick(View v) {
txtView.setText("");
SearchView sv=(SearchView) ((MainActivity)c).findViewById(R.id.sv);
sv.setQuery(""+planets.get(pos).getName(),false);
sv.clearFocus();
String d=planets.get(pos).getPrice();
int id1=planets.get(pos).getId();
String text=planets.get(pos).getName();
txtView.setText(id1 + System.getProperty ("line.separator") +text + System.getProperty ("line.separator") +d);
planets.clear();
v.setVisibility(View.GONE);
txtView.setVisibility(View.VISIBLE);
}
});
here is Debug error
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.tutorials.hp.sqlitefilterlistview, PID: 22679
java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:260)
at java.util.ArrayList.get(ArrayList.java:313)
at com.tutorials.hp.sqlitefilterlistview.mListView.CustomAdapter$1.onClick(CustomAdapter.java:106)
at android.view.View.performClick(View.java:5265)
at android.view.View$PerformClick.run(View.java:21534)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5728)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
I/Process: Sending signal. PID: 22679 SIG: 9
Disconnected from the target VM, address: 'localhost:8600', transport: 'socket'
it points to line CustomAdapter.java(106) which is
String d=planets.get(pos).getPrice();
how can i solve this?
Also i have tried setQuery() but it only works for first or some items,
when i click another item it stops the app.
Yes, it looks like setQuery(text, false) is what you need. Now, the fact that the app works for some items and for other crashes most probably it is not related to setQuery(..).
For example if the pos variable exceeds the bounds of the planets list size, then a call to planets.get(pos) will fail with IndexOutOfBoundsException, but check the stacktrace, it will tell you exactly why the app is crashing.

recycler adapter showing "You must call removeView() on the child's parent first" error

i have made a recyclerview adapter where i am showing many things in recyclerview. and i am also showing some image in a view with viewpager. its working fine but when i am adding viewPagerArrowIndicator library for viewpager indicator its showing above error during i scroll back to up from bottom. i have tried solutions with stackoverflow but there are no similar error or solution
logcat:
Process: com.systechdigital.webadeal, PID: 30287
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
at android.view.ViewGroup.addViewInner(ViewGroup.java:4659)
at android.view.ViewGroup.addView(ViewGroup.java:4495)
at android.view.ViewGroup.addView(ViewGroup.java:4436)
at android.view.ViewGroup.addView(ViewGroup.java:4409)
at com.sembozdemir.viewpagerarrowindicator.library.ViewPagerArrowIndicator.arrange(ViewPagerArrowIndicator.java:107)
at com.sembozdemir.viewpagerarrowindicator.library.ViewPagerArrowIndicator.bind(ViewPagerArrowIndicator.java:82)
at com.systechdigital.webadeal.NewsFeedAdapter.onBindViewHolder(NewsFeedAdapter.java:197)
at com.systechdigital.webadeal.NewsFeedAdapter.onBindViewHolder(NewsFeedAdapter.java:38)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6310)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6343)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5289)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5552)
at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:270)
at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:324)
at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:337)
at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:344)
at android.support.v7.widget.GapWorker.run(GapWorker.java:370)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
my adapter code:
//image slider
if(newsFeedClassArrayList.get(position).getImageList()!=null){
holder.viewPager.setVisibility(View.VISIBLE);
viewPagerAdapter=new ViewPagerAdapter(context,newsFeedClassArrayList.get(position).getImageList());
holder.viewPager.setAdapter(viewPagerAdapter);
**//error showing below on line**
holder.viewPagerArrowIndicator.bind(holder.viewPager);
holder.viewPagerArrowIndicator.setArrowIndicatorRes(R.drawable.arrow_left_black_24dp,R.drawable.arrow_right_black_24dp);
viewPagerAdapter.notifyDataSetChanged();
}else {
holder.viewPager.setVisibility(View.GONE);
}
holder.timeStampTvId.setText(newsFeedClass.getTimeStamp());
xml code:
<com.sembozdemir.viewpagerarrowindicator.library.ViewPagerArrowIndicator
android:id="#+id/viewPagerArrowIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<android.support.v4.view.ViewPager
android:layout_width="wrap_content"
android:layout_height="180dp"
android:id="#+id/viewPagerId_imageView"
android:minHeight="0dp"
>
</android.support.v4.view.ViewPager>
</com.sembozdemir.viewpagerarrowindicator.library.ViewPagerArrowIndicator>
Try to use another library, even if you don't want to use that just use it for testing.
Maybe you can try this - https://github.com/ongakuer/CircleIndicator

Another java.lang.IllegalArgumentException: parameter must be a descendant of this view

Users are getting the following exception in my app on certain phones. I tried reproducing the error myself but couldn't . I searched through stack overflow for similar problems and tried their solutions but none seem to be working.
Here are the answers I already tried:
Preventing/catching "IllegalArgumentException: parameter must be a descendant of this view" error
java.lang.IllegalArgumentException: parameter must be a descendant of this view Error
Setting the following attribute: android:windowSoftInputMode="stateHidden|adjustPan"
I have an edittext but it's outside of the expandablelistview.
I am trying to find an explanation on why this is happening and what might cause it to happen. I apologize but I can't post any code.
java.lang.IllegalArgumentException: parameter must be a descendant of
this view
at android.view.ViewGroup.offsetRectBetweenParentAndChild(ViewGroup.java:4568)
at android.view.ViewGroup.offsetDescendantRectToMyCoords(ViewGroup.java:4505)
at android.view.ViewGroup$ViewLocationHolder.init(ViewGroup.java:6743)
at android.view.ViewGroup$ViewLocationHolder.obtain(ViewGroup.java:6680)
at android.view.ViewGroup$ChildListForAccessibility.init(ViewGroup.java:6638)
at android.view.ViewGroup$ChildListForAccessibility.obtain(ViewGroup.java:6606)
at android.view.ViewGroup.addChildrenForAccessibility(ViewGroup.java:1697)
at android.view.ViewGroup.onInitializeAccessibilityNodeInfoInternal(ViewGroup.java:2525)
at android.view.View.onInitializeAccessibilityNodeInfo(View.java:5213)
at android.widget.AdapterView.onInitializeAccessibilityNodeInfo(AdapterView.java:946)
at android.widget.AbsListView.onInitializeAccessibilityNodeInfo(AbsListView.java:1449)
at android.widget.ListView.onInitializeAccessibilityNodeInfo(ListView.java:3781)
at android.widget.ExpandableListView.onInitializeAccessibilityNodeInfo(ExpandableListView.java:1348)
at android.view.View.createAccessibilityNodeInfoInternal(View.java:5174)
at android.view.View.createAccessibilityNodeInfo(View.java:5161)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:811)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchDescendantsOfRealNode(AccessibilityInteractionController.java:834)
at android.view.AccessibilityInteractionController$AccessibilityNodePrefetcher.prefetchAccessibilityNodeInfos(AccessibilityInteractionController.java:720)
at android.view.AccessibilityInteractionController.findAccessibilityNodeInfoByAccessibilityIdUiThread(AccessibilityInteractionController.java:147)
at android.view.AccessibilityInteractionController.access$300(AccessibilityInteractionController.java:49)
at android.view.AccessibilityInteractionController$PrivateHandler.handleMessage(AccessibilityInteractionController.java:971)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5097)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(NativeStart.java)
The problem was caused by adding a wrongly inflated header to two different listviews.
I inflated a view using listViewA as the parent and adding it to listViewB also. As such:
RelativeLayout listViewHeader = (RelativeLayout) inflater.inflate(R.layout.listviewheader, listViewA, false);
// Set some views
listViewA.addHeaderView(listViewHeader);
listViewB.addHeaderView(listViewHeader);
I fixed it by changing the above to the following:
RelativeLayout listViewHeaderA = (RelativeLayout) inflater.inflate(R.layout.listviewheader, listViewA, false);
RelativeLayout listViewHeaderB = (RelativeLayout) inflater.inflate(R.layout.listviewheader, listViewB, false);
listViewA.addHeaderView(listViewHeaderA);
listViewB.addHeaderView(listViewHeaderB);
As for reproducing the crash, the problem happened when Google Talk Back is turned on. Here is my take on the situation: Google Talk Back does text to speech on views that are in focus (either by touch or auto-focused). When it enters a screen with multiple views requesting focus, it reads the views according to a hierarchy/order.
If you have a layout (parent) with three views (children), Google Talk Back checks how the views are arranged and then reads them accordingly. For example, in a layout with three textview lined up horizontally, Google Talk Back may read the left textview first, then the middle one, then the one on the right.
In my case, I was inflating a header view with listViewA as the parent and adding that view to both listViewA and listViewB. When listViewBgains focus and Google Talk Back tries to interpret its children, it sees the header view is not a child of the list and throws the exception. This also happens if I inflate the header view with no parents (null).
I have append on scroll listener in ScrollView
and solve problem
lst_payment_info.setOnScrollListener(new AbsListView.OnScrollListener() {
#Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (SCROLL_STATE_TOUCH_SCROLL == scrollState) {
View currentFocus = getCurrentFocus();
if (currentFocus != null) {
currentFocus.clearFocus();
}
}
}
#Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
I was also getting the same error when Google TalkBack is turned on. In my case, I was inflating a view with the boolean attachToParent true.So by making it false worked for me.

Prevent app crash when cut operation in TextView

I put text-selectable TextView in Android layout with setTextIsSelectable(true) and the text is set by Html.fromHtml(sometexts).
It works good to allow user to copy text.
My JellyBean device gives small baloons with cut/copy/paste buttons on top of the selected text.
But when user accidently click cut icon left side of the copy menu, it crashes.
The log is given as below but there is no point to handle this exception in my application.
How to prevent app crash?
01-06 19:29:16.025 2048-2048/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.ClassCastException: android.text.SpannableString cannot be cast to android.text.Editable
at android.widget.TextView.deleteText_internal(TextView.java:8865)
at android.widget.TextView.onTextContextMenuItem(TextView.java:8315)
at android.widget.Editor$ActionPopupWindow.onClick(Editor.java:3556)
at android.view.View.performClick(View.java:4114)
at android.view.View$PerformClick.run(View.java:17097)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4885)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
I'm not sure and I can't test it right now but maybe try to put that in your TextView xml :
android:bufferType="spannable"
If it's still not working you can implement yourself your action for the selectable event.
Look at the answer of this question here :
Android- How can I show text selection on textview?

android.view.InflateException: Binary XML file: Error inflating class fragment

I have a very frustrating error that I cannot explain. I created an Android application that uses Android AppCompat to make it compatible with older versions. Here is my main activity layout file:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="#+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
android:id="#+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
the container. -->
<fragment android:id="#+id/navigation_drawer"
android:layout_width="#dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:name="com.fragment.NavigationDrawerFragment" />
</android.support.v4.widget.DrawerLayout>
And here is main code of my activity :
public class MainActivity extends ActionBarActivity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
The main problem here is : above code run smoothly on almost devices (stimulated device, or some real devices). But when I run it on Samsung S3. It notices this error:
java.lang.RuntimeException: Unable to start activity ComponentInfo{view.MainActivity}: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2081)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2106)
at android.app.ActivityThread.access$700(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1217)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4856)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #25: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:316)
at android.app.Activity.setContentView(Activity.java:1901)
at android.support.v7.app.ActionBarActivity.superSetContentView(ActionBarActivity.java:208)
at android.support.v7.app.ActionBarActivityDelegateICS.setContentView(ActionBarActivityDelegateICS.java:111)
at android.support.v7.app.ActionBarActivity.setContentView(ActionBarActivity.java:76)
Please tell me how to fix error, thanks :)
After long time for debugging, I have fixed this problem. (Although I still cannot explain why). That I change property android:name to class. (although on Android Document, they say those properties are same, but it works !!!)
So, it should change from :
android:name="com.fragment.NavigationDrawerFragment"
to
class = "com.fragment.NavigationDrawerFragment"
So, new layout should be :
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
android:id="#+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
If you're not building against API 17 or higher, use
android:layout_gravity="left" instead. -->
<!-- The drawer is given a fixed width in dp and extends the full height of
the container. -->
<fragment android:id="#+id/navigation_drawer"
android:layout_width="#dimen/navigation_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
class = "com.fragment.NavigationDrawerFragment" />
Hope this help :)
TL/DR: An exception occurred during the creation of a fragment referenced from a higher-level layout XML. This exception caused the higher-level layout inflation to fail, but the initial exception was not reported; only the higher-level inflation failure shows up in the stack trace. To find the root cause, you have to catch and log the initial exception.
The initial cause of the error could be a wide variety of things, which is why there are so many different answers here as to what fixed the problem for each person. For some, it had to do with the id, class, or name attributes. For others it was due to a permissions issue or a build setting. For me, those didn't fix the problem; instead there was a drawable resource that existed only in drawable-ldrtl-xhdpi, instead of in an applicable place like drawable.
But those are just details. The big-picture problem is that the error message that shows up in logcat doesn't describe the exception that started it all. When a higher-level layout XML references a fragment, the fragment's onCreateView() is called. When an exception occurs in a fragment's onCreateView() (for example while inflating the fragment's layout XML), it causes the inflation of the higher-level layout XML to fail. This higher-level inflation failure is what gets reported as an exception in the error logs. But the initial exception doesn't seem to travel up the chain well enough to be reported.
Given that situation, the question is how to expose the initial exception, when it doesn't show up in the error log.
The solution is pretty straightforward: Put a try/catch block around the contents of the fragment's onCreateView(), and in the catch clause, log the exception:
public View onCreateView(LayoutInflater inflater, ViewGroup contnr, Bundle savedInstSt) {
try {
mContentView = inflater.inflate(R.layout.device_detail_frag, null);
// ... rest of body of onCreateView() ...
} catch (Exception e) {
Log.e(TAG, "onCreateView", e);
throw e;
}
}
It may not be obvious which fragment class's onCreateView() to do this to, in which case, do it to each fragment class that's used in the layout that caused the problem. For example, in the OP's case, the app's code where the exception occurred was
at android.app.Activity.setContentView(Activity.java:1901)
which is
setContentView(R.layout.activity_main);
So you need to catch exceptions in the onCreateView() of any fragments referenced in layout activity_main.
In my case, the root cause exception turned out to be
Caused by: android.content.res.Resources$NotFoundException: Resource
"com.example.myapp:drawable/details_view" (7f02006f) is not a
Drawable (color or path): TypedValue{t=0x1/d=0x7f02006f a=-1
r=0x7f02006f}
This exception didn't show up in the error log until I caught it in onCreateView() and logged it explicitly. Once it was logged, the problem was easy enough to diagnose and fix (details_view.xml existed only under the ldrtl-xhdpi folder, for some reason). The key was catching the exception that was the root of the problem, and exposing it.
It doesn't hurt to do this as a boilerplate in all your fragments' onCreateView() methods. If there is an uncaught exception in there, it will crash the activity regardless. The only difference is that if you catch and log the exception in onCreateView(), you won't be in the dark as to why it happened.
P.S. I just realized this answer is related to #DaveHubbard's, but uses a different approach for finding the root cause (logging vs. debugger).
I couldn't solve my problem using provided answers. Finally I changed this:
<fragment
android:id="#+id/fragment_food_image_gallery"
android:name="ir.smartrestaurant.ui.fragment.ImageGalleryFragment"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout="#layout/fragment_image_gallery"
tools:layout="#layout/fragment_image_gallery" />
to this :
<FrameLayout
android:id="#+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="200dp" />
,
private void showGallery() {
ImageGalleryFragment fragment = new ImageGalleryFragment()
getSupportFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
}
and it works.
If you are using it inside fragment, use getChildFragmentManager instead of getSupportFragmentManager.
I had the same problem, issue, tried all the answers in this thread to no avail. My solution was, I hadn't added an ID in the Activity XML. I didn't think it would matter, but it did.
So in the Activity XML I had:
<fragment
android:name="com.covle.hellocarson.SomeFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
But should've had:
<fragment
android:id="#+id/some_fragment"
android:name="com.covle.hellocarson.SomeFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
If someone would be happy to comment on why this is, I'm all ears, to other, I hope this helps.
It might not be needed for you anymore, but if further readers find it helpful. I have exact same android.view.InflateException:...Error inflating class fragment. I had all right libraries included. Solved by adding one more user permission in the AndroidManifest.xml file i.e. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
Btw I was running Android Studio 0.8.9 on Ubuntu 12.04.
I have the same problem because I did not implement the listener. See the following code with /*Add This!*/.
public class SomeActivity extends AppCompatActivity
implements BlankFragment.OnFragmentInteractionListener /*Add this!*/
{
#Override /*Add This!*/
public void onFragmentInteraction(Uri uri){ /*Add This!*/
} /*Add This!*/
}
FYI, my fragment class is something like the following:
public class SomeFragment extends Fragment {
private OnFragmentInteractionListener mListener;
#Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
public interface OnFragmentInteractionListener {
public void onFragmentInteraction(Uri uri);
}
}
Edit:
I also notice this same error message under another circumstances when there is an exception in the onCreate function of the Fragment. I have something as the following:
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
int ID = getArguments().getInt("val");
return rootView;
}
Because I reuse this fragment, I total forget to set arguments. Then the result of getArguments() is null. Obviously, I get a null pointer exception here. I will suggest you keep an eye on mistakes like this as well.
Is your NavigationDrawerFragment extending the android.support.v4.app.Fragment? In other words, are you importing the correct package?
import android.support.v4.app.Fragment;
I also had this issue. I solved it by replacing the import in MainActivity and NavigationDrawerFragment
From
import android.app.Activity;
import android.app.ActionBar;
To
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
I updated MainActivity to extends ActionBarActivity instead of Activity
public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks
Also use ActionBar actionBar = getSupportActionBar(); to get the ActionBar
And I updated the following function in NavigationDrawerFragment
private ActionBar getActionBar()
{
return ((ActionBarActivity)getActivity()).getSupportActionBar();
}
i faced this problem and solved it by using following codes. I was beginning fragment transaction by using childfragment manager.
layout:
<fragment
class="com.google.android.youtube.player.YouTubePlayerSupportFragment"
android:id="#+id/youtube_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
this is how i began fragment transaction:
youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);
the following codes explains how i removed the fragment which added by using childfragmentmanger.
#Override
public void onDestroyView() {
super.onDestroyView();
youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);
if (youTubePlayerFragment != null)
{
getChildFragmentManager().beginTransaction().remove(youTubePlayerFragment).commitAllowingStateLoss();
}
youTubePlayer = null;
}
I have had similar problems on and off. The error message often provides very little detail, regardless of actual cause. But I found a way to get more useful info. It turns out that the internal android class 'LayoutInflater.java' (in android.view package) has an 'inflate' method that re-throws an exception, but does not pick up the details, so you lose info on the cause.
I used AndroidStudio, and set a breakpoint at LayoutInflator line 539 (in the version I'm working in), which is the first line of the catch block for a generic exception in that 'inflate' method:
} catch (Exception e) {
InflateException ex = new InflateException(
parser.getPositionDescription()
+ ": " + e.getMessage());
ex.initCause(e);
throw ex;
If you look at 'e' in the debugger, you will see a 'cause' field. It can be very helpful in giving you a hint about what really occurred. This is how, for example, I found that the parent of an included fragment must have an id, even if not used in your code. Or that a TextView had an issue with a dimension.
Just in case someone needs this.
Assumptions: Device phone hooked up to USB cable and your IDE reading to launch
the app.
Go to the command prompt to determine issue:
enter adb logcat
Then launch your app from IDE.
You will an exception.
In my case: I was deploying an Android app of Version 2.3 to a mobile device
that did not support the widget "Space"
Add this name field in navigation
android:name="androidx.navigation.fragment.NavHostFragment"
<fragment
android:id="#+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="#navigation/navigation"
app:layout_constraintBottom_toTopOf="#+id/bottomNavigationView"
app:layout_constraintTop_toTopOf="parent">
This problem arises when you have a custom class that extends a different class (in this case a view) and does not import all the constructors required by the class.
For eg : public class CustomTextView extends TextView{}
This class would have 4 constructors and if you miss out on any one it would crash. For the matter of fact I missed out the last one which was used by Lollipop added that constructor and worked fine.
we must also need to add following in build.gradle(app)
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
whenever we are using new layouts or new design features.
hope this helps you.
As mentioned in a previous post,
rename
android:name="com.fragment.NavigationDrawerFragment"
to
class = "com.fragment.NavigationDrawerFragment"
Still, it did not work for me. I then just used the Class Name without the com.fragment part and voila it worked. So change it finally to
class = "NavigationDrawerFragment"
After none of the answers here helped me, I opted to run app in debug mode moving across every line of onCreateView in my fragment (NavigationDrawerFragment in your case). And noticed that fragment was having difficulty with inflating because of a NullPointerException.
E.g.
mySeekBar = (SeekBar) getActivity().findViewById(R.id.mySeekBar);
mySeekBar.setOnSeekBarChangeListener(this);
Here mySeekBar was set to null (because I had missed adding the control in appropriate layout) and the next line got into NPE which came out as InflateException.
Also, as suggested above, rename android:name to class.
This issue can arise for various reasons mentioned above. I would recommend line-by-line debug flow to know what is wrong.
After long time of tries, this is how I solved the problem after none of the above answers could.
Extend AppCompatActivity for your Main activity instead of Activity.
Add android:theme="#style/Theme.AppCompat.Light" to your <Activity..../> in the AndroidManifest.xml
In your NavigationDrawerFragment Class, change your ActionBar instances to
ActionBar mActionBar=((AppCompatActivity)getActivity()).getSupportActionBar();
EDIT
It should be a consistency between the Activity and Layout.
If the Layout has one of the AppCompat Theme such like Theme.AppCompat.Light, your Activity should extends AppCompatActivity.
I wanted to have the burger icon and a Navigation Drawer that looks like the Android Gmail App, but I ended up with an ugly Navigation Drawer.
All that because all my Classes extends Activity instead of AppCompatActivity.
I re-factored the entire project to extend AppCompatActivity, then Right-Click on the Layout Folder, chose new -> Activity then Navigation Drawer Activity and Boom, everything is done for me!
android.view.InflateException: Binary XML file line #16: Error inflating class com.google.android.material.bottomappbar.BottomAppBar
The view can be anything that is failing to get inflated, this kind of error comes when there is a clash in resolving the class names or name attribute of a view referred in the XML file.
When I get the same error I just got everything clean and safe in UI-XML file,
the view I was using,
<com.google.android.material.bottomappbar.BottomAppBar
android:id="#+id/bottomAppBar"
style="#style/Widget.MaterialComponents.BottomAppBar.Colored"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
app:hideOnScroll="true"
app:menu="#menu/bottom_app_bar"
app:navigationIcon="#drawable/ic__menu_24"/>
I was using a style attribute which was referring the Material components property.
But my styles.xml had...
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
....
</style>
Where the class resolving was facing the conflict. My view attributes referred a property that was not defined in my app theme. The right parent theme from material components helped me.
So I changed the parent attribute to...
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
...
</style>
Which resolved the issue.
For some of you that still haven't found a solution for this, in my case it was happening because I had an OOM (Out of Memory) issue. This can happen when you have for example a memory leak in your app when using it for a long time. In my stack trace, this was the main reason.
I don't know if this will help.
I had this problem with a TextView I had in the layout I was trying to inflate (android.view.InflateException: Binary XML file line #45: Error inflating class TextView).
I had set the following XML attribute android:textSize="?android:attr/textAppearanceLarge" which wasn't allowing for the layout to be inflated.
Don't know exactly why, (I'm still a bit new to Android - less than a year of experience), might have something to do with calling system attributes, idk, all I know is as soon as I used plain old #dimen/md_text_16sp (which is a custom of mine), problem solved :)
Hope this helps...
I had this on a 4.4.2 device, but 5+ was fine. The cause: inside a custom view's initialisation, I was creating a TextView(Context context, AttributeSet attrs, #AttrRes int defStyleAttr, #StyleRes int defStyleRes), which is API 21+.
Android Studio 2.1 doesn't complain about it even though it is annotated TargetApi(21). Apparently, Android Studio 2.2 will correct this and properly show it as an error.
Hope this helps someone.
I am a bit late to the party but Non of these answer helped me in my case. I was using Google map as SupportMapFragment and PlaceAutocompleteFragment both in my fragment. As all the answers pointed to the fact that the problem is with SupportMapFragment being the map to be recreated and redrawn.
But I also had problem with PlaceAutocompleteFragment. So here is the working solution for those who are facing this problem because of SupportMapFragment and SupportMapFragment
mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.mapFragment);
FragmentManager fm = getChildFragmentManager();
if (mapFragment == null) {
mapFragment = SupportMapFragment.newInstance();
fm.beginTransaction().replace(R.id.mapFragment, mapFragment).commit();
fm.executePendingTransactions();
}
mapFragment.getMapAsync(this);
//Global PlaceAutocompleteFragment autocompleteFragment;
if (autocompleteFragment == null) {
autocompleteFragment = (PlaceAutocompleteFragment) getActivity().getFragmentManager().findFragmentById(R.id.place_autoCompleteFragment);
}
And in onDestroyView clear the SupportMapFragment and SupportMapFragment
#Override
public void onDestroyView() {
super.onDestroyView();
if (getActivity() != null) {
Log.e("res","place dlted");
android.app.FragmentManager fragmentManager = getActivity().getFragmentManager();
android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.remove(autocompleteFragment);
fragmentTransaction.commit();
autocompleteFragment = null;
}
}
In my particular case the problem was I added this line to a TextView :
android:background="?attr/selectableItemBackground"
After removing this, everything started to work fine.
I don`t know what happened, but Changing Fragment to FrameLayout solved my problem after many hours of struggle.
<FrameLayout
android:id="#+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
I think the basic problem is with "android:targetSdkVersion" which is defined in AndroidManifest.xml. In my case, the initial value which I have defined as:
android:targetSdkVersion=16
I changed it to:
android:targetSdkVersion=22
which resolved my all of the error. So, setting up the correct "targetSdkVersion" is also important before building an android app.
In case someone else comes here and the answers do not help solve the problem, one more thing to try.
As others have mentioned, this usually is caused by an issue nested in the XML itself as opposed to something you did wrong in your Java. In my case, it was a super easy (and stupid) mistake to fix.
I had code like this:
<view
android:layout_width="fill_parent"
android:layout_height="1dip"
android:id="#+id/view44"
android:background="#color/gray"
/>
When all I had to do was capitalize the v in 'View' so that the system recogized it. Check that your custom views (Or Fragments, recyclerviews, etc) all have the proper capitalized declaration up front so that the XML auto-complete will match it to the appropriate view.
I had this error too, and after very long debugging the problem seamed to be that my MainClass extended Activity instead of FrameActivity, in my case, the xml wasn't a problem. Hope to help you.
In my case .
The layout i was trying to inflate had
<include
layout = "...."
/>
tag, removing it fixed it.
I was trying to inflate a previous layout designed for a Actvity into the view-pager adapter.
My error was caused by a different problem.
I was passing a bundle from an Activity to its fragment.
When I commented the code receiving the bundle in the fragment the error was gone.
As it turns out, my error was due to the below "getArguments();" part which was returning null.
Bundle args = getArguments();
Upon checking the Activity sending code, I realized I had a silly mistake in the below;
Bundle bundle =new Bundle();
bundle.putInt("recipeID", recipe_position);
Fragment mainFragment = new MainActivityFragment();
mainFragment.setArguments(bundle);
FragmentManager fragmentManager = getSupportFragmentManager();
--> fragmentManager.beginTransaction()
.replace(R.id.container, new MainActivityFragment(),
DetailRecipeActivityFragment.TAG)
.commit();
I was creating a NEW fragment in the line with the arrow. Whereas I should have used the pre-instantiated fragment that already had my bundle.
So it should have been:
Bundle bundle =new Bundle();
bundle.putInt("recipeID", recipe_position);
Fragment mainFragment = new MainActivityFragment();
mainFragment.setArguments(bundle);
Fragment mainFragment = new MainActivityFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
-->fragmentManager.beginTransaction()
.replace(R.id.container, mainFragment,
DetailRecipeActivityFragment.TAG)
.commit();
I don't know why exactly it throws this error instead of an NPE, but this solved my error in case someone is having the same scenario
I was having the same problem, in my case the package name was wrong, fixing it solved the problem.

Categories

Resources