0

I am having problem with fragments.I am developing an app like 360 security and i am having problem implementing fragments ,getting "Binary XML file line #1: Error inflating class fragment".

Here is my xml file.I have tried every solution please help me.

Thanks in advance.

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/item_list"
    android:name="sabby.completesecurity.MainListFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ItemListActivity"
    tools:layout="@android:layout/list_content" />

This is my activity file:

    package sabby.completesecurity;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.FrameLayout;
    import android.widget.ImageView;
    import sabby.completesecurity.R;

     public class MainActivityCache extends FragmentActivity implements sabby.completesecurity.MainCallbacks {

private boolean mIsDualPane;
private boolean mIsArtShowed = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_cache);
    mIsDualPane = findViewById(R.id.item_detail_container) != null;

    //Show an art when no fragment is showed, we make sure no detail fragment is present.
    if (mIsDualPane && getFragmentManager().findFragmentByTag(sabby.completesecurity.DetailFragment.FRAGMENT_TAG) == null) {
        ImageView imageView = new ImageView(this);
        imageView.setImageResource(R.mipmap.ic_launcher);
        imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        ((FrameLayout) findViewById(R.id.item_detail_container)).addView(imageView);
        mIsArtShowed = true;
    }
}

@Override
public void onItemSelected(String packageName) {
    if (mIsDualPane) {
        //Hide art when a fragment is showed.
        if (mIsArtShowed) {
            ((FrameLayout) findViewById(R.id.item_detail_container)).removeAllViews();
            mIsArtShowed = false;
        }
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.item_detail_container, DetailFragment.getInstance(packageName), DetailFragment.FRAGMENT_TAG)
                .commit();
    } else {
        Intent intent = new Intent(this, DetailActivity.class);
        intent.putExtra(DetailFragment.EXTRA_PACKAGE_NAME, packageName);
        startActivity(intent);
    }
}



@Override
protected void onStart() {
    super.onStart();
    registerReceiver(receiver, getIntentFilter());
}

@Override
protected void onStop() {
    super.onStop();
    unregisterReceiver(receiver);
}

private void showAboutDialog() {
    new AlertDialog.Builder(this)
            .setTitle("About")
            .setView(getLayoutInflater().inflate(R.layout.about_dialog_message, null))
            .setNegativeButton(android.R.string.ok, null)
            .show();
}

/**
 * Used to update the list if a package is added or removed.
 */
private IntentFilter getIntentFilter() {
    IntentFilter filter = new IntentFilter();
    filter.addDataScheme("package");
    filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
    filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
    filter.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED);
    filter.addAction(Intent.ACTION_PACKAGE_ADDED);
    return filter;
}
enter code here
BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        MainListFragment mainListFragment = (MainListFragment) getFragmentManager().findFragmentById(R.id.item_list);
        if (mainListFragment != null)
            mainListFragment.loadList();
    }
};

}

MainListFragment.java

  package sabby.completesecurity;

import android.app.ActionBar;
import android.app.Activity;
import android.app.ListFragment;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.RemoteException;
import android.text.format.Formatter;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.SectionIndexer;
import android.widget.Spinner;
import android.widget.TextView;

import sabby.completesecurity.utils.Utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

public class MainListFragment extends ListFragment implements AdapterView.OnItemClickListener, AdapterView.OnItemSelectedListener {

    private static final int SORT_NAME = 0;
    private static final int SORT_PKG = 1;
    private static final int SORT_DOMAIN = 2;
    private static final int SORT_INSTALLATION = 3;
    private static final int SORT_SIZE = 4;
    private static final String INSTANCE_STATE_SORT_BY = "sort_by";

    private Adapter mAdapter;
    private List<Item> mItemList = new ArrayList<Item>();
    private int mOnSizeFinishedItemCount;
    private PackageManager mPackageManager;
    private ProgressDialog mProgressDialog;
    private LayoutInflater mLayoutInflater;
    private MainCallbacks mCallbacks;
    private Context mContext;
    private Async mAsyncLoader;
    private Spinner mSpinner;
    private boolean mSpinnerListenerAuthorized;

    private SimpleDateFormat mSimpleDateFormat;

    private int mSortBy = 0;

    class Item {
        ApplicationInfo applicationInfo;
        String label;
        Long date;
        Long size = -1L;
    }

    private int mColorGrey1;
    private int mColorGrey2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        mProgressDialog = new ProgressDialog(mContext);
        mProgressDialog.setTitle(R.string.loading_apps);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(false);
        //Used to prevent message not showing later
        mProgressDialog.setMessage("");

        mPackageManager = mContext.getPackageManager();
        mSimpleDateFormat = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
        mColorGrey1 = getResources().getColor(R.color.grey_1);
        mColorGrey2 = getResources().getColor(R.color.grey_2);

        ActionBar actionBar = getActivity().getActionBar();
        actionBar.setDisplayShowCustomEnabled(true);

        mSpinner = new Spinner(actionBar.getThemedContext());
        SpinnerAdapter spinnerAdapter = new SpinnerAdapter(actionBar.getThemedContext(),
                R.array.sort_spinner_items, android.R.layout.simple_list_item_1);
        mSpinner.setAdapter(spinnerAdapter);
        mSpinnerListenerAuthorized = false;
        mSpinner.setOnItemSelectedListener(this);

        ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT);
        actionBar.setCustomView(mSpinner, layoutParams);

        if (savedInstanceState != null)
            setSortBy(savedInstanceState.getInt(INSTANCE_STATE_SORT_BY, -1), false);
    }

    @Override
    public void onStart() {
        super.onStart();
        mSpinner.setSelection(mSortBy);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(INSTANCE_STATE_SORT_BY, mSortBy);
    }

    private void onTaskEnded(List<Item> list) {
        RetainedFragment retainedFragment = (RetainedFragment) getFragmentManager().findFragmentByTag(RetainedFragment.FRAGMENT_TAG);
        retainedFragment.setList(list);

        mItemList = list;
        mAdapter.notifyDataSetChanged();

        if (getListView().getAdapter() == null)
            setListAdapter(mAdapter);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getListView().setOnItemClickListener(this);
        getListView().setFastScrollEnabled(true);

        mAdapter = new Adapter();

        RetainedFragment retainedFragment = (RetainedFragment) getFragmentManager()
                .findFragmentByTag(RetainedFragment.FRAGMENT_TAG);

        if (retainedFragment == null) {
            retainedFragment = new RetainedFragment();
            getFragmentManager()
                    .beginTransaction()
                    .add(retainedFragment, RetainedFragment.FRAGMENT_TAG)
                    .commit();
        }

        if (retainedFragment.getList() != null) {
            onTaskEnded(retainedFragment.getList());

            mOnSizeFinishedItemCount = mItemList.size();
            //Notify spinner that size sort is available
            SpinnerAdapter adapter = (SpinnerAdapter) mSpinner.getAdapter();
            adapter.notifyDataSetChanged();
        } else
            loadList();
    }

    public void loadList() {
        mAsyncLoader = new Async();
        mAsyncLoader.execute();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mCallbacks = (MainCallbacks) activity;
        mContext = activity;
        mLayoutInflater = activity.getLayoutInflater();
    }

    @Override
    public void onDetach() {
        super.onDetach();
        if (mAsyncLoader != null)
            mAsyncLoader.cancel(true);
        mCallbacks = null;
        mContext = null;
        mLayoutInflater = null;
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        if (mCallbacks != null)
            mCallbacks.onItemSelected(mItemList.get(i).applicationInfo.packageName);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.fragment_main_list, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_refresh:
                loadList();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
        if (mSpinnerListenerAuthorized)
            setSortBy(i, true);

        mSpinnerListenerAuthorized = true;
    }

    /**
     * Sort main list if provided value is valid.
     * @param sort Must be one of SORT_*
     * @param checkViews Set if views have to be updated, eg. when restoring state, views aren't
     *                   created yet, so value must be false
     */
    public void setSortBy(int sort, boolean checkViews) {
        if (sort >= SORT_NAME && sort <= SORT_SIZE) {
            mSortBy = sort;

            if (checkViews) {
                checkFastScroll();

                sortApplicationList(mItemList, mSortBy);
                mAdapter.notifyDataSetChanged();
            }
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> adapterView) {

    }

    private void checkFastScroll() {
        getListView().setFastScrollEnabled(mSortBy == SORT_NAME);
    }

    public void sortApplicationList(List<Item> list, final int sortBy) {
        Collections.sort(list, new Comparator<Item>() {
            @Override
            public int compare(Item item1, Item item2) {
                switch (sortBy) {
                    case SORT_NAME:
                        return item1.label.compareTo(item2.label);
                    case SORT_PKG:
                        return item1.applicationInfo.packageName.compareTo(item2.applicationInfo.packageName);
                    case SORT_DOMAIN:
                        boolean isSystem1 = (item1.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
                        boolean isSystem2 = (item2.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
                        return Utils.compareBooleans(isSystem1, isSystem2);
                    case SORT_INSTALLATION:
                        //Sort in decreasing order
                        return -item1.date.compareTo(item2.date);
                    case SORT_SIZE:
                        return -item1.size.compareTo(item2.size);
                    default:
                        return 0;
                }
            }
        });
    }

    /**
     * This method is called by each item when it has finished retrieving its size
     * When all items have finished, we set size sort available in spinner, and invalidate
     * main list to display sizes in UI.
     */
    private void onItemFinishedSizeProcess() {
        mOnSizeFinishedItemCount ++;

        if (mOnSizeFinishedItemCount == mItemList.size()) {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    SpinnerAdapter adapter = (SpinnerAdapter) mSpinner.getAdapter();
                    adapter.notifyDataSetChanged();
                    mAdapter.notifyDataSetChanged();
                }
            });
        }
    }

    class Adapter extends BaseAdapter implements SectionIndexer {

        class ViewHolder {
            ImageView icon;
            TextView label;
            TextView packageName;
            TextView version;
            TextView isSystemApp;
            TextView date;
            TextView size;
            IconAsyncTask iconLoader;
        }

        String sections = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

        @Override
        public int getCount() {
            return mItemList.size();
        }

        @Override
        public Object getItem(int i) {
            return mItemList.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            ViewHolder holder;
            if (view == null) {
                view = mLayoutInflater.inflate(R.layout.main_list_item, null);
                holder = new ViewHolder();
                holder.icon = (ImageView) view.findViewById(R.id.icon);
                holder.label = (TextView) view.findViewById(R.id.label);
                holder.packageName = (TextView) view.findViewById(R.id.packageName);
                holder.version = (TextView) view.findViewById(R.id.version);
                holder.isSystemApp = (TextView) view.findViewById(R.id.isSystem);
                holder.date = (TextView) view.findViewById(R.id.date);
                holder.size = (TextView) view.findViewById(R.id.size);
                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
                holder.iconLoader.cancel(true);
            }

            view.setBackgroundColor(i % 2 == 0 ? mColorGrey2 : mColorGrey1);

            Item item = mItemList.get(i);
            ApplicationInfo info = item.applicationInfo;

            try {
                PackageInfo packageInfo = mPackageManager.getPackageInfo(info.packageName, 0);
                holder.version.setText(packageInfo.versionName);
                Date date = new Date(packageInfo.firstInstallTime);
                holder.date.setText(mSimpleDateFormat.format(date));
            } catch (PackageManager.NameNotFoundException e) {
                //Do nothing
            }

            holder.iconLoader = new IconAsyncTask(holder.icon, info);
            holder.iconLoader.execute();

            holder.label.setText(info.loadLabel(mPackageManager));

            holder.packageName.setText(info.packageName);

            boolean isSystemApp = (info.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
            holder.isSystemApp.setText(isSystemApp ? getString(R.string.system) : getString(R.string.user));

            if (item.size != -1L)
                holder.size.setText(Formatter.formatFileSize(getActivity(), item.size));

            return view;
        }

        @Override
        public int getPositionForSection(int section) {
            for (int i = 0; i < this.getCount(); i++) {
                String item = mItemList.get(i).label;
                if (item.charAt(0) == sections.charAt(section))
                    return i;
            }
            return 0;
        }

        @Override
        public int getSectionForPosition(int i) {
            return 0;
        }

        @Override
        public Object[] getSections() {
            String[] sectionsArr = new String[sections.length()];
            for (int i = 0; i < sections.length(); i++)
                sectionsArr[i] = "" + sections.charAt(i);

            return sectionsArr;
        }

        class IconAsyncTask extends AsyncTask<Void, Integer, Drawable> {

            ImageView imageView;
            ApplicationInfo info;

            IconAsyncTask(ImageView imageView, ApplicationInfo info) {
                this.imageView = imageView;
                this.info = info;
            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                imageView.setVisibility(View.INVISIBLE);
            }

            @Override
            protected Drawable doInBackground(Void... voids) {
                if (!isCancelled())
                    return info.loadIcon(mPackageManager);
                return null;
            }

            @Override
            protected void onPostExecute(Drawable drawable) {
                super.onPostExecute(drawable);
                imageView.setImageDrawable(drawable);
                imageView.setVisibility(View.VISIBLE);
            }
        }
    }

    class SpinnerAdapter extends BaseAdapter {

        private Context mContext;
        private int mLayoutResId;
        private String[] mItems;

        public SpinnerAdapter(Context themedContext, int arrayResId, int layoutResId) {
            mContext = themedContext;
            mItems = themedContext.getResources().getStringArray(arrayResId);
            mLayoutResId = layoutResId;
        }

        @Override
        public int getCount() {
            return mItems.length;
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        //It make no sense to implement recycled view system because there is only 5 items in list
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            view = View.inflate(mContext, mLayoutResId, null);

            if (view instanceof TextView)
                ((TextView) view).setText(mItems[i]);

            return view;
        }

        /**
         * Set sort_by_size item disabled if all items haven't retrieved them size.
         */
        @Override
        public boolean isEnabled(int position) {
            return position != SORT_SIZE || mItemList != null && mOnSizeFinishedItemCount == mItemList.size();
        }
    }

    class Async extends AsyncTask<Void, Async.Progress, List<Item>> {

        class Progress {
            String label;
            int totalSize;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog.show();
        }

        @Override
        protected List<Item> doInBackground(Void... voids) {
            List<ApplicationInfo> applicationInfos = mPackageManager.getInstalledApplications(PackageManager.GET_META_DATA);
            Progress progress = new Progress();
            progress.totalSize = applicationInfos.size();

            List<Item> itemList = new ArrayList<Item>(applicationInfos.size());
            mOnSizeFinishedItemCount = 0;

            for (ApplicationInfo applicationInfo : applicationInfos) {
                if (isCancelled())
                    break;
                Item item = new Item();
                item.applicationInfo = applicationInfo;
                String label = applicationInfo.loadLabel(mPackageManager).toString();
                item.label = label;
                try {
                    item.date = mPackageManager.getPackageInfo(applicationInfo.packageName, 0).firstInstallTime;
                } catch (PackageManager.NameNotFoundException e) {
                    item.date = 0L;
                }
                itemList.add(item);

                getItemSize(item);

                progress.label = label;
                publishProgress(progress);
            }

            sortApplicationList(itemList, mSortBy);

            return itemList;
        }

        private void getItemSize(final Item item) {
            try {
                Method getPackageSizeInfo = mPackageManager.getClass().getMethod(
                        "getPackageSizeInfo", String.class, IPackageStatsObserver.class);

                getPackageSizeInfo.invoke(mPackageManager, item.applicationInfo.packageName, new IPackageStatsObserver.Stub() {
                    @Override
                    public void onGetStatsCompleted(final PackageStats pStats, boolean succeeded)
                            throws RemoteException {
                        if (succeeded)
                            item.size = pStats.codeSize + pStats.cacheSize + pStats.dataSize
                                    + pStats.externalCodeSize + pStats.externalCacheSize + pStats.externalDataSize
                                    + pStats.externalMediaSize + pStats.externalObbSize;
                        else
                            item.size = -1L;

                        onItemFinishedSizeProcess();
                    }
                });
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
                onItemFinishedSizeProcess();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
                onItemFinishedSizeProcess();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
                onItemFinishedSizeProcess();
            }
        }

        @Override
        protected void onProgressUpdate(Progress... values) {
            super.onProgressUpdate(values);
            Progress progress = values[0];

            mProgressDialog.setMessage(progress.label);
            if (mProgressDialog.getMax() == 100)
                mProgressDialog.setMax(progress.totalSize);
            mProgressDialog.incrementProgressBy(1);
        }

        @Override
        protected void onPostExecute(List<Item> list) {
            super.onPostExecute(list);
            mProgressDialog.hide();
            onTaskEnded(list);
        }

        @Override
        protected void onCancelled(List<Item> list) {
            super.onCancelled(list);
            mProgressDialog.hide();
        }
    }
}
1

2 Answers 2

1

In the xml that you have posted,replace the TAG <Fragment> with <LinearLayout> or <RelativeLayout> and inside this you simply show what you want to display in you UI

Make sure you extend Fragment class in you fragment activity

Sign up to request clarification or add additional context in comments.

Comments

0

Could you post the code for your fragment? The problem could be with your import statements. You have 'import android.support.v4.app.FragmentActivity'. Do you have 'import android.support.v4.app.Fragment' in your fragment file?

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.