android.view.InflateException: Tệp XML nhị phân: Lỗi làm tăng phân đoạn lớp


151

Tôi có một lỗi rất bực bội mà tôi không thể giải thích. Tôi đã tạo một ứng dụng Android sử dụng Android AppCompatđể làm cho nó tương thích với các phiên bản cũ hơn. Đây là tập tin bố trí hoạt động chính của tôi:

<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>

Và đây là mã chính của hoạt động của tôi:

public class MainActivity extends ActionBarActivity {
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   }
}

Vấn đề chính ở đây là: mã trên chạy trơn tru trên hầu hết các thiết bị (thiết bị được kích thích hoặc một số thiết bị thực). Nhưng khi tôi chạy nó trên Samsung S3. Nó nhận thấy lỗi này:

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)

Xin vui lòng cho tôi biết làm thế nào để sửa lỗi, cảm ơn :)


1
Trong dòng này, bạn sẽ nhận được kiểm tra ngoại lệ xem tên lớp và tên gói có chính xác hay không..android: name = "com.hqt.hac.view.fragment.NavlationDrawerFragment"
pvs

1
tôi đã kiểm tra và lớp học này là đúng tôi có thể biên dịch và chạy trên một số thiết bị nhưng không phải samsung s3. tôi nghĩ rằng một số vấn đề kỳ lạ ở đây :(
hqt

bạn đúng nếu nó đang thực thi trên một số thiết bị chứ không phải trên s3 thì đó là một vấn đề lạ .. lời khuyên của tôi là hãy thử sử dụng sherlacFragment chek một lần ..
kalyan pvs

Tôi đã giải quyết vấn đề ở đây: stackoverflow.com/a/33128448/4366715 .
daniel kilinskas

1
Đối với những người đang cố gắng chẩn đoán nguyên nhân của lỗi này: Bản sửa lỗi giai thoại ở đây là cá trích đỏ. Có một ngoại lệ trước đó xảy ra trong quá trình lạm phát của đoạn không xuất hiện trong dấu vết ngăn xếp . Nó có thể là bất cứ điều gì. Để khắc phục sự cố, bạn phải tìm hiểu ngoại lệ trước đó là gì. Để làm điều đó, hãy xem câu trả lời của tôi hoặc của @ DaveHubbard.
LarsH

Câu trả lời:


126

Sau một thời gian dài để gỡ lỗi, tôi đã khắc phục vấn đề này. (Mặc dù tôi vẫn không thể giải thích tại sao). Rằng tôi đổi tài sản android:namethành class. (mặc dù trên Tài liệu Android, họ nói rằng các thuộc tính đó giống nhau, nhưng nó hoạt động !!!)

Vì vậy, nó nên thay đổi từ:

 android:name="com.fragment.NavigationDrawerFragment"

đến

class = "com.fragment.NavigationDrawerFragment"

Vì vậy, bố cục mới nên:

<!-- 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" />

Hy vọng điều này giúp đỡ :)


4
Tôi gặp vấn đề này khi cố gắng làm theo hướng dẫn chính thức của Android. Sửa chữa của bạn (thay đổi android:idthành class) làm việc cho tôi. Tôi cũng nhận được cảnh báo Lint để thay đổi Fragmentđể fragment, mà tôi đã làm.
stevepastelan

9
@DownVoter: lỗi này là nhầm lẫn. Và tôi may mắn tìm được cách khắc phục. Tôi thực sự xin lỗi nếu bài viết của tôi không thể sửa lỗi của bạn vì tôi cũng không thể giải thích tại sao. Nhưng tôi nghĩ nó không nên nhận phiếu bầu. :)
hqt

2
Tôi tự hỏi nếu bạn có tai nạn này đáng tin cậy mà không cần thay đổi từ nameđến class, tôi đã có một vài người dùng báo cáo tai nạn này nhưng không thể repro nó bản thân mình!
Daniel Wilson

8
Không làm việc cho tôi. Tôi mệt quá. 2h của dev và không thể tìm thấy lý do tại sao nó không hoạt động (Dòng tệp xml nhị phân ... errror thổi phồng lớp). Bất kỳ ý tưởng ?
Cocorico

32

Tôi không thể giải quyết vấn đề của mình bằng các câu trả lời được cung cấp. Cuối cùng tôi đã thay đổi điều này:

<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" />

đến đây:

<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();
    }

Và nó hoạt động.
Nếu bạn đang sử dụng nó bên trong đoạn, hãy sử dụng getChildFragmentManager thay vì getSupportFragmentManager .


31

TL / DR : Một ngoại lệ xảy ra trong quá trình tạo một đoạn được tham chiếu từ XML bố cục mức cao hơn. Ngoại lệ này khiến lạm phát bố cục cấp cao hơn thất bại, nhưng ngoại lệ ban đầu không được báo cáo ; chỉ có sự thất bại lạm phát ở cấp độ cao hơn xuất hiện trong dấu vết ngăn xếp. Để tìm ra nguyên nhân gốc, bạn phải nắm bắt và đăng nhập ngoại lệ ban đầu .


Nguyên nhân ban đầu của lỗi có thể là rất nhiều thứ, đó là lý do tại sao có rất nhiều câu trả lời khác nhau ở đây về vấn đề khắc phục vấn đề cho mỗi người. Đối với một số người, nó đã phải làm với id, classhoặc namecác thuộc tính. Đối với những người khác, đó là do vấn đề quyền hoặc cài đặt bản dựng. Đối với tôi, những người đã không khắc phục vấn đề; thay vào đó là một nguồn tài nguyên có thể rút ra chỉ tồn tại trong drawable-ldrtl-xhdpi, thay vì ở một nơi áp dụng như drawable.

Nhưng đó chỉ là chi tiết. Vấn đề lớn là thông báo lỗi xuất hiện trong logcat không mô tả ngoại lệ bắt đầu tất cả. Khi XML bố trí mức cao hơn tham chiếu một đoạn, đoạn đó onCreateView()được gọi. Khi một ngoại lệ xảy ra trong một đoạnonCreateView() (ví dụ như trong khi thổi phồng bố cục XML của đoạn), điều đó làm cho lạm phát của XML bố cục mức cao hơn không thành công. Thất bại lạm phát cấp cao hơn này là những gì được báo cáo là một ngoại lệ trong nhật ký lỗi. Nhưng ngoại lệ ban đầu dường như không đi lên chuỗi đủ tốt để được báo cáo.

Với tình huống đó, câu hỏi là làm thế nào để phơi bày ngoại lệ ban đầu, khi nó không hiển thị trong nhật ký lỗi.

Giải pháp khá đơn giản: Đặt một khối try/ catchxung quanh nội dung của đoạn onCreateView()và trong catchmệnh đề, ghi nhật ký ngoại lệ:

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;
    }
}

Nó có thể không được rõ ràng lớp mảnh của onCreateView()để làm điều này đến, trong trường hợp này, làm điều đó để mỗi lớp đoạn đó được sử dụng trong cách bố trí đó gây ra vấn đề. Ví dụ: trong trường hợp của OP, mã của ứng dụng nơi xảy ra ngoại lệ là

at android.app.Activity.setContentView(Activity.java:1901)

đó là

   setContentView(R.layout.activity_main);

Vì vậy, bạn cần phải bắt ngoại lệ trong onCreateView()bất kỳ đoạn nào được tham chiếu trong bố cục activity_main.

Trong trường hợp của tôi, ngoại lệ nguyên nhân gốc hóa ra là

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}

Ngoại lệ này không xuất hiện trong nhật ký lỗi cho đến khi tôi bắt gặp onCreateView()và đăng nhập rõ ràng. Khi đã được ghi lại, vấn đề đủ dễ để chẩn đoán và khắc phục ( details_view.xmlchỉ tồn tại trong ldrtl-xhdpithư mục, vì một số lý do). Chìa khóa đã nắm bắt được ngoại lệ là gốc rễ của vấn đề và phơi bày nó.

Sẽ không hại gì khi làm điều này như một cái nồi trong tất cả các onCreateView()phương pháp của bạn . Nếu có một ngoại lệ chưa được bắt gặp trong đó, nó sẽ phá vỡ hoạt động bất kể. Sự khác biệt duy nhất là nếu bạn bắt và đăng nhập ngoại lệ onCreateView(), bạn sẽ không ở trong bóng tối như lý do tại sao nó xảy ra.

PS Tôi mới nhận ra câu trả lời này có liên quan đến @ DaveHubbard, nhưng sử dụng một cách tiếp cận khác để tìm nguyên nhân gốc (ghi nhật ký so với trình gỡ lỗi).


2
Bạn có thể tiết kiệm cho tôi hàng giờ gỡ lỗi. Thanh danh!
Szymon Sadło

16

Tôi đã có cùng một vấn đề, vấn đề, đã thử tất cả các câu trả lời trong chủ đề này nhưng không có kết quả. Giải pháp của tôi là, tôi đã không thêm ID trong Activity XML. Tôi không nghĩ nó sẽ quan trọng, nhưng nó đã làm.

Vì vậy, trong XML hoạt động tôi đã có:

<fragment
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Nhưng nên có:

<fragment
    android:id="@+id/some_fragment"
    android:name="com.covle.hellocarson.SomeFragment"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Nếu ai đó sẽ vui lòng bình luận về lý do tại sao, tôi lại là người khác, tôi hy vọng điều này sẽ giúp ích.


1
Cảm ơn, điều này đã làm việc cho tôi. Tôi đã bỏ qua một id trong nhiều tháng, nhưng sau một số thay đổi bố cục đột nhiên tôi bắt đầu gặp sự cố này. Android thật kỳ lạ.
erisco

Bạn trả lời làm việc cho tôi. Tôi chỉ tự hỏi tại sao tôi giả sử đặt thuộc tính id khi tôi không sử dụng nó ở bất cứ đâu. Bạn có thể giải thích cho tôi không?
Moshii

12

Nó có thể không cần thiết cho bạn nữa, nhưng nếu độc giả tiếp tục thấy nó hữu ích. Tôi có chính xác như vậy android.view.InflateException:...Error inflating class fragment. Tôi đã có tất cả các thư viện đúng bao gồm. Giải quyết bằng cách thêm một quyền người dùng trong AndroidManifest.xmltệp tức là<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

Btw tôi đã chạy Android Studio 0.8.9 on Ubuntu 12.04.


Đã làm cho tôi! Cảm ơn rất nhiều!
Dadan

12

Tôi có cùng một vấn đề vì tôi đã không thực hiện người nghe. Xem đoạn mã sau với /*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, lớp phân đoạn của tôi là một cái gì đó như sau:

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);
    }
}

Biên tập:

Tôi cũng nhận thấy thông báo lỗi tương tự trong các trường hợp khác khi có một ngoại lệ trong onCreatechức năng của Fragment. Tôi có một cái gì đó như sau:

@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;
} 

Bởi vì tôi sử dụng lại đoạn này, tôi hoàn toàn quên đặt đối số. Sau đó, kết quả getArguments()null. Rõ ràng, tôi nhận được một nullngoại lệ con trỏ ở đây. Tôi sẽ đề nghị bạn để mắt đến những sai lầm như thế này.


1
Cảm ơn! Điều này đã giúp rất nhiều!
DLee

8

Là NavigationDrawerFragment của bạn có mở rộng android.support.v4.app.Fragment không? Nói cách khác, bạn đang nhập đúng gói?

import android.support.v4.app.Fragment;

6

Tôi cũng đã có vấn đề này. Tôi đã giải quyết nó bằng cách thay thế việc nhập MainActivityNavigationDrawerFragment

Từ

import android.app.Activity;
import android.app.ActionBar;

Đến

import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;

Tôi đã cập nhật MainActivityđể mở rộng ActionBarActivitythay vì Hoạt động

public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks

Đồng thời sử dụng ActionBar actionBar = getSupportActionBar();để nhận ActionBar

Và tôi đã cập nhật chức năng sau trong NavigationDrawerFragment

private ActionBar getActionBar()
{
    return ((ActionBarActivity)getActivity()).getSupportActionBar();
}

Tôi nghĩ rằng đây là câu trả lời đúng. Nhưng tôi đã sử dụng AppCompatActivity thay vì ActionBarActivity (không bị phản đối) và cũng không xóa nhập android.app.ActionBar (như phương thức onAttach sử dụng nó)
GramThanos 17/2/2016

6

tôi đã đối mặt với vấn đề này và giải quyết nó bằng cách sử dụng các mã sau đây. Tôi đã bắt đầu giao dịch phân đoạn bằng cách sử dụng trình quản lý bảo vệ trẻ em.

bố trí:

                  <fragment
                    class="com.google.android.youtube.player.YouTubePlayerSupportFragment"
                    android:id="@+id/youtube_fragment"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"/>

đây là cách tôi bắt đầu giao dịch mảnh:

   youTubePlayerFragment = (YouTubePlayerSupportFragment) getChildFragmentManager().findFragmentById(R.id.youtube_fragment);

các mã sau đây giải thích cách tôi loại bỏ đoạn được thêm bằng cách sử dụng 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;
    }

TY Ali. Bạn đã cứu ngày của tôi!
vm345

Hoạt động tốt. Cảm ơn bạn!
Polyariz

4

Tôi đã có vấn đề tương tự và tắt. Thông báo lỗi thường cung cấp rất ít chi tiết, bất kể nguyên nhân thực tế. Nhưng tôi tìm thấy một cách để có được thông tin hữu ích hơn. Nó chỉ ra rằng lớp 'InternalInflater.java' (trong gói android.view) có một phương thức 'thổi phồng' để ném lại một ngoại lệ, nhưng không thu thập thông tin chi tiết, do đó bạn mất thông tin về nguyên nhân.

Tôi đã sử dụng AndroidStudio và đặt điểm dừng tại dòng LayoutInflator 539 (trong phiên bản tôi đang làm việc), đây là dòng đầu tiên của khối bắt cho một ngoại lệ chung trong phương pháp 'lạm phát' đó:

        } catch (Exception e) {
            InflateException ex = new InflateException(
                    parser.getPositionDescription()
                            + ": " + e.getMessage());
            ex.initCause(e);
            throw ex;

Nếu bạn nhìn vào 'e' trong trình gỡ lỗi, bạn sẽ thấy trường 'nguyên nhân'. Nó có thể rất hữu ích trong việc cung cấp cho bạn một gợi ý về những gì thực sự xảy ra. Đây là cách, ví dụ, tôi thấy rằng cha mẹ của một đoạn được bao gồm phải có id, ngay cả khi không được sử dụng trong mã của bạn. Hoặc là một TextView có vấn đề với kích thước.


3

Chỉ trong trường hợp ai đó cần điều này. Giả định: Điện thoại thiết bị được nối với cáp USB và đọc IDE của bạn để khởi chạy ứng dụng. Đi đến dấu nhắc lệnh để xác định vấn đề: nhập adb logcat

Sau đó khởi chạy ứng dụng của bạn từ IDE. Bạn sẽ là một ngoại lệ.

Trong trường hợp của tôi: Tôi đã triển khai một ứng dụng Android của Phiên bản 2.3 cho một thiết bị di động không hỗ trợ tiện ích "Space"


3

Vấn đề này phát sinh khi bạn có một lớp tùy chỉnh mở rộng một lớp khác (trong trường hợp này là dạng xem) và không nhập tất cả các hàm tạo mà lớp yêu cầu.

Ví dụ: lớp công khai CustomTextView mở rộng TextView {}

Lớp này sẽ có 4 constructor và nếu bạn bỏ lỡ bất kỳ cái nào thì nó sẽ bị sập. Đối với vấn đề thực tế, tôi đã bỏ lỡ cái cuối cùng được sử dụng bởi Lollipop đã thêm vào hàm tạo đó và hoạt động tốt.


2

chúng ta cũng cần phải thêm vào sau trong build.gradle (ứng dụng)

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'

Bất cứ khi nào chúng tôi đang sử dụng bố trí mới hoặc các tính năng thiết kế mới. Hy vọng điều này sẽ giúp bạn.


2

Như đã đề cập trong một bài viết trước,
đổi tên

android:name="com.fragment.NavigationDrawerFragment"

đến

class = "com.fragment.NavigationDrawerFragment"

Tuy nhiên, nó không làm việc cho tôi. Sau đó tôi chỉ sử dụng Tên lớp mà không có phần com.fragment và voila nó hoạt động. Vì vậy, thay đổi nó cuối cùng để

class = "NavigationDrawerFragment"

2

Sau khi không có câu trả lời nào ở đây giúp tôi, tôi đã chọn chạy ứng dụng ở chế độ gỡ lỗi di chuyển trên mọi dòng onCreateView trong đoạn của tôi (NavigationDrawerFragment trong trường hợp của bạn). Và nhận thấy rằng mảnh vỡ đã gặp khó khăn với lạm phát vì một NullPulumException. Ví dụ

mySeekBar = (SeekBar) getActivity().findViewById(R.id.mySeekBar);
mySeekBar.setOnSeekBarChangeListener(this);

Ở đây mySeekBar được đặt thành null (vì tôi đã bỏ lỡ việc thêm điều khiển trong bố cục thích hợp) và dòng tiếp theo được đưa vào NPE, xuất hiện dưới dạng InflateException. Ngoài ra, như đã đề xuất ở trên, đổi tên android: name thành class.

Vấn đề này có thể phát sinh vì nhiều lý do nêu trên. Tôi muốn giới thiệu luồng gỡ lỗi từng dòng để biết điều gì sai.


Và lỗi này có xảy ra trong onCreateView()phương pháp của một đoạn không?
LarsH

1

Đối với một số bạn vẫn chưa tìm thấy giải pháp cho vấn đề này, trong trường hợp của tôi, điều đó đã xảy ra vì tôi gặp vấn đề OOM (Hết bộ nhớ). Điều này có thể xảy ra khi bạn bị rò rỉ bộ nhớ trong ứng dụng khi sử dụng trong một thời gian dài. Trong dấu vết ngăn xếp của tôi, đây là lý do chính.


1

Tôi không biết nếu điều này sẽ giúp.

Tôi gặp vấn đề này với TextView mà tôi gặp phải trong bố cục mà tôi đang cố gắng tăng ( android.view.InflateException: Dòng tệp nhị phân XML # 45: Lỗi làm tăng lớp TextView ).

Tôi đã thiết lập thuộc tính XML sau android: textSize = "? Android: attr / textAppparentLarge" không cho phép bố cục bị thổi phồng.

Không biết chính xác tại sao, ( tôi vẫn còn hơi mới với Android - chưa đầy một năm kinh nghiệm ), có thể có liên quan đến việc gọi các thuộc tính hệ thống, idk, tất cả những gì tôi biết là ngay khi tôi sử dụng @dimen / md lòng_16sp ( là một tùy chỉnh của tôi ), vấn đề đã được giải quyết :)

Hi vọng điêu nay co ich...


Tôi không có đoạn nào cũng như thuộc tính textSize android. Lỗi của tôi liên quan đến TextInputLayout với kiểu tùy chỉnh kế thừa TextAppparent.AppCompat thay vì Widget.Design.TextInputLayout:. stackoverflow.com/questions/19874882/
Mạnh

1

Tôi đã có điều này trên một thiết bị 4.4.2, nhưng 5+ vẫn ổn. Nguyên nhân: bên trong khởi tạo của chế độ xem tùy chỉnh, tôi đã tạo một TextView(Context context, AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes)API 21+.

Android Studio 2.1 không phàn nàn về điều đó mặc dù nó được chú thích TargetApi(21). Rõ ràng, Android Studio 2.2 sẽ sửa lỗi này và hiển thị đúng là lỗi.

Hy vọng điều này sẽ giúp được ai đó.


1

Tôi đến bữa tiệc hơi muộn nhưng Non trong số những câu trả lời này đã giúp tôi trong trường hợp của mình. Tôi đã sử dụng bản đồ Google dưới dạng SupportMapFragmentPlaceAutocompleteFragment cả trong đoạn của tôi. Vì tất cả các câu trả lời đều chỉ ra thực tế rằng vấn đề là với SupportMapFragment là bản đồ được tạo lại và vẽ lại.

Nhưng tôi cũng gặp vấn đề với PlaceAutocompleteFragment. Vì vậy, đây là giải pháp hiệu quả cho những ai đang gặp phải vấn đề này vì SupportMapFragmentSupportMapFragment

 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);

    }

Và trong onDestroyView, xóa SupportMapFragment và 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;
    }


}

1

Sau một thời gian dài cố gắng, đây là cách tôi giải quyết vấn đề sau khi không có câu trả lời nào ở trên có thể.

  1. Mở rộng AppCompatActivitycho Mainhoạt động của bạn thay vì Activity.
  2. Thêm android:theme="@style/Theme.AppCompat.Light"vào của bạn <Activity..../>trongAndroidManifest.xml
  3. Trong NavigationDrawerFragmentLớp của bạn , thay đổi ActionBarthể hiện của bạn thành

    ActionBar mActionBar=((AppCompatActivity)getActivity()).getSupportActionBar();

BIÊN TẬP

Nó phải là một sự thống nhất giữa Hoạt độngBố cục . Nếu Bố cục có một trong Chủ đề AppCompat như vậy Theme.AppCompat.Light, Hoạt động của bạn sẽ như vậy extends AppCompatActivity.

Tôi muốn có biểu tượng burgerNgăn kéo Điều hướng trông giống như Ứng dụng Gmail trên Android , nhưng tôi đã kết thúc với một Ngăn kéo Điều hướng xấu xí . Tất cả điều đó bởi vì tất cả các lớp học của tôi extends Activitythay vì AppCompatActivity.

Tôi đã giới thiệu lại toàn bộ dự án để mở rộng AppCompatActivity, sau đó nhấp chuột phải vào Layout Folder, đã chọn new-> Activitysau đó Navigation Drawer Activityvà Boom, mọi thứ đã được thực hiện cho tôi!


1
android.view.InflateException: Binary XML file line #16: Error inflating class com.google.android.material.bottomappbar.BottomAppBar

Khung nhìn có thể là bất cứ thứ gì không bị thổi phồng, loại lỗi này xuất hiện khi có xung đột trong việc giải quyết tên lớp hoặc thuộc tính tên của một khung nhìn được xem trong tệp XML.

Khi tôi gặp lỗi tương tự, tôi đã nhận được mọi thứ sạch sẽ và an toàn trong tệp UI-XML, chế độ xem tôi đang sử dụng,

   <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"/>

Tôi đã sử dụng một thuộc tính kiểu được tham chiếu đến thuộc tính Thành phần vật liệu. Nhưng tệp XML của tôi đã ...

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
....
</style>

Trường hợp lớp giải quyết đã phải đối mặt với cuộc xung đột. Thuộc tính chế độ xem của tôi đã giới thiệu một thuộc tính không được xác định trong chủ đề ứng dụng của tôi. Các chủ đề phụ huynh đúng từ các thành phần vật chất đã giúp tôi. Vì vậy, tôi đã thay đổi thuộc tính cha thành ...

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
...
</style>

Mà giải quyết vấn đề.


0

Tôi nghĩ vấn đề cơ bản là với "android: targetSdkVersion" được định nghĩa trong AndroidManifest.xml. Trong trường hợp của tôi, giá trị ban đầu mà tôi đã xác định là:

android:targetSdkVersion=16

Tôi đã đổi nó thành:

android:targetSdkVersion=22

đã giải quyết tất cả các lỗi của tôi. Vì vậy, việc thiết lập "targetSdkVersion" chính xác cũng rất quan trọng trước khi xây dựng một ứng dụng Android.


0

Trong trường hợp có người khác đến đây và câu trả lời không giúp giải quyết vấn đề, một điều nữa cần thử.

Như những người khác đã đề cập, điều này thường được gây ra bởi một vấn đề được lồng trong chính XML trái ngược với điều gì đó bạn đã làm sai trong Java của mình. Trong trường hợp của tôi, đó là một lỗi siêu dễ (và ngu ngốc) để sửa.

Tôi đã có mã như thế này:

<view
    android:layout_width="fill_parent"
    android:layout_height="1dip"
    android:id="@+id/view44"
    android:background="@color/gray"
    />

Khi tất cả những gì tôi phải làm là viết hoa chữ v trong 'Chế độ xem' để hệ thống ghi lại nó. Kiểm tra xem các chế độ xem tùy chỉnh của bạn (Hoặc Đoạn, tái chế, v.v.) đều có khai báo viết hoa đúng cách để tự động hoàn thành XML sẽ khớp với chế độ xem phù hợp.


0

Tôi cũng gặp lỗi này và sau một thời gian dài gỡ lỗi, vấn đề chính là hoạt động mở rộng MainClass của tôi thay vì FrameActivity, trong trường hợp của tôi, xml không phải là vấn đề. Hy vọng sẽ giúp bạn.


0

Trong trường hợp của tôi .

Bố cục tôi đang cố gắng để tăng

<include 
 layout  = "...."
/>

gắn thẻ, gỡ bỏ nó.

Tôi đã cố gắng đưa một bố cục trước đó được thiết kế cho Actvity vào bộ điều hợp chế độ xem.


0

Lỗi của tôi là do một vấn đề khác.

Tôi đã chuyển một bó từ một Hoạt động đến đoạn của nó. Khi tôi nhận xét mã nhận được gói trong đoạn, lỗi đã biến mất. Hóa ra, lỗi của tôi là do "getArgument ();" bên dưới một phần đã trở về null.

Bundle args = getArguments();

Khi kiểm tra mã gửi Hoạt động, tôi nhận ra mình có một lỗi ngớ ngẩn ở bên dưới;

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();

Tôi đã tạo ra một đoạn MỚI trong dòng bằng mũi tên. Trong khi đó tôi nên sử dụng đoạn tiền khởi tạo đã có gói của tôi. Vì vậy, nó nên có được:

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();

Tôi không biết tại sao chính xác nó lại ném lỗi này thay vì NPE, nhưng điều này đã giải quyết lỗi của tôi trong trường hợp ai đó có cùng kịch bản


0

Tôi đã có cùng một vấn đề, trong trường hợp của tôi tên gói là sai, sửa nó đã giải quyết vấn đề.



0

Tôi đã gặp lỗi này khi có RecyclerView ở thư mục gốc của tệp Fragment.xml,

nhưng khi tôi gói nó với Viewgroup, ứng dụng đã hoạt động tốt.


0

Thêm trường tên này trong điều hướng

android: name = "androidx.navulation.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">
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.