1

I am creating an app in which I want to open an Image slider in popup when an image I click from gallery view.But I getting Following error. I look for this error in stackoverflow but didnt found the reason of getting this error. Error:

11-15 14:17:58.945: E/AndroidRuntime(14106): FATAL EXCEPTION: main
11-15 14:17:58.945: E/AndroidRuntime(14106): Process: info.androidhive.listviewfeed, PID: 14106
11-15 14:17:58.945: E/AndroidRuntime(14106): android.view.InflateException: Binary XML file line #6: Error inflating class info.androidhive.imageslider.helper.TouchImageView
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:707)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at info.androidhive.listviewfeed.adapter.FullScreenImageAdapter.instantiateItem(FullScreenImageAdapter.java:52)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:832)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.support.v4.view.ViewPager.populate(ViewPager.java:982)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.View.measure(View.java:16834)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5374)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1621)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:742)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:607)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.View.measure(View.java:16834)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5374)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.View.measure(View.java:16834)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5374)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.View.measure(View.java:16834)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5374)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:340)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2332)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.View.measure(View.java:16834)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2252)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1283)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1513)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1192)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6231)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.Choreographer.doCallbacks(Choreographer.java:591)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.Choreographer.doFrame(Choreographer.java:560)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.os.Handler.handleCallback(Handler.java:808)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.os.Handler.dispatchMessage(Handler.java:103)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.os.Looper.loop(Looper.java:193)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.app.ActivityThread.main(ActivityThread.java:5292)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at java.lang.reflect.Method.invokeNative(Native Method)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at java.lang.reflect.Method.invoke(Method.java:515)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at dalvik.system.NativeStart.main(Native Method)
11-15 14:17:58.945: E/AndroidRuntime(14106): Caused by: java.lang.ClassNotFoundException: Didn't find class "info.androidhive.imageslider.helper.TouchImageView" on path: DexPathList[[zip file "/data/app/info.androidhive.listviewfeed-1.apk"],nativeLibraryDirectories=[/data/app-lib/info.androidhive.listviewfeed-1, /vendor/lib, /system/lib]]
11-15 14:17:58.945: E/AndroidRuntime(14106):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.LayoutInflater.createView(LayoutInflater.java:559)
11-15 14:17:58.945: E/AndroidRuntime(14106):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
11-15 14:17:58.945: E/AndroidRuntime(14106):    ... 42 more

Here is the class to call a pagerview

public class FeedListAdapter extends BaseAdapter {  
private Activity activity;
private LayoutInflater inflater;
private List<FeedItem> feedItems;
private FullScreenImageAdapter adapter;
private ViewPager viewPager;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();

ArrayList<String> filePaths = new ArrayList<String>();

File directory;

public FeedListAdapter(Activity activity, List<FeedItem> feedItems) {
    this.activity = activity;
    this.feedItems = feedItems;
}

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

@Override
public Object getItem(int location) {
    return feedItems.get(location);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (inflater == null)
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null)
        convertView = inflater.inflate(R.layout.feed_item, null);

    if (imageLoader == null)
        imageLoader = AppController.getInstance().getImageLoader();

    TextView name = (TextView) convertView.findViewById(R.id.name);
    TextView timestamp = (TextView) convertView
            .findViewById(R.id.timestamp);
    TextView statusMsg = (TextView) convertView
            .findViewById(R.id.txtStatusMsg);
    TextView url = (TextView) convertView.findViewById(R.id.txtUrl);
    NetworkImageView profilePic = (NetworkImageView) convertView
            .findViewById(R.id.profilePic);
    @SuppressWarnings("deprecation")
    Gallery feedImageView = (Gallery) convertView
            .findViewById(R.id.feedImage1);

    FeedItem item = feedItems.get(position);

    name.setText(item.getName());

    // Converting timestamp into x ago format


    Calendar c1 = Calendar.getInstance();      
    @SuppressWarnings("unused")
    int timeAgo = c1.get(Calendar.YEAR) + c1.get(Calendar.MONTH) +      c1.get(Calendar.DAY_OF_MONTH) + c1.get(Calendar.HOUR_OF_DAY) + c1.get(Calendar.MINUTE);
    directory = new File(android.os.Environment.getExternalStorageDirectory()
    + File.separator + "niece");

if (directory.isDirectory()) {
// getting list of file paths
File[] listFiles = directory.listFiles();

// Check for count
if (listFiles.length > 0) {

    // loop through all files
    for (int i = 0; i < listFiles.length; i++) {

        // get file path
        String filePath = listFiles[i].getAbsolutePath();

        // check for supported file extension

            filePaths.add(filePath);
    }
   } else {
    // image directory is empty
    Toast.makeText(
            activity,
            "niece is empty. Please load some images in it !",
            Toast.LENGTH_LONG).show();
}

 } else {
AlertDialog.Builder alert = new AlertDialog.Builder(activity);
alert.setTitle("Error!");
alert.setMessage("niece directory path is not valid! Please set the image directory name AppConstant.java class");
alert.setPositiveButton("OK", null);
alert.show();
 }

    // Chcek for empty status message
    if (!TextUtils.isEmpty(item.getStatus())) {
        statusMsg.setText(item.getStatus());
        statusMsg.setVisibility(View.VISIBLE);
    } else {
        // status is empty, remove from view
        statusMsg.setVisibility(View.GONE);
    }

    // Checking for null feed url
    if (item.getUrl() != null) {
        url.setText(Html.fromHtml("<a href=\"" + item.getUrl() + "\">"
                + item.getUrl() + "</a> "));

        // Making url clickable
        url.setMovementMethod(LinkMovementMethod.getInstance());
        url.setVisibility(View.VISIBLE);
    } else {
        // url is null, remove from the view
        url.setVisibility(View.GONE);
    }

    // user profile pic
    profilePic.setBackgroundResource(R.drawable.ic_launcher);

    // Feed image
    if (item.getImge() != null) {
        feedImageView.setAdapter(new ImageAdapter(this));


        feedImageView.setVisibility(View.VISIBLE);

    } else {
        feedImageView.setVisibility(View.GONE);
    }
    feedImageView.setOnItemClickListener(new OnItemClickListener() {



        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position,long id) {
            // TODO Auto-generated method stub
            Dialog popImg = new Dialog(activity);
            popImg.requestWindowFeature(Window.FEATURE_NO_TITLE);
            popImg.setContentView(R.layout.activity_fullscreen_view);
            viewPager = (ViewPager) popImg.findViewById(R.id.pager);

            popImg.setTitle("Testing");
            adapter = new FullScreenImageAdapter(activity,
                    filePaths);

            viewPager.setAdapter(adapter);

            // displaying selected image first
            viewPager.setCurrentItem(position);
            popImg.show();
        }
    });

    return convertView;
}}

Here is the pageviewer class

import info.androidhive.listviewfeed.R;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RelativeLayout;

 public class FullScreenImageAdapter extends PagerAdapter {

private Activity _activity;
private ArrayList<String> _imagePaths;
private LayoutInflater inflater;

// constructor
public FullScreenImageAdapter(Activity activity,
        ArrayList<String> imagePaths) {
    this._activity = activity;
    this._imagePaths = imagePaths;
}

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

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == ((RelativeLayout) object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    TouchImageView imgDisplay;
    Button btnClose;

    inflater = (LayoutInflater) _activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View viewLayout = inflater.inflate(R.layout.layout_fullscreen_image, container,false);

    imgDisplay = (TouchImageView) viewLayout.findViewById(R.id.imgDisplay);
    btnClose = (Button) viewLayout.findViewById(R.id.btnClose);

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    Bitmap bitmap = BitmapFactory.decodeFile(_imagePaths.get(position), options);
    imgDisplay.setImageBitmap(bitmap);

    // close button click event
    btnClose.setOnClickListener(new View.OnClickListener() {            
        @Override
        public void onClick(View v) {
            _activity.finish();
        }
    }); 

    ((ViewPager) container).addView(viewLayout);

    return viewLayout;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager) container).removeView((RelativeLayout) object);

}

}

TouchImageView class

package info.androidhive.listviewfeed.adapter;

import android.content.Context;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;

public class TouchImageView extends ImageView {

Matrix matrix;

// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

// Remember some things for zooming
PointF last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 3f;
float[] m;

int viewWidth, viewHeight;
static final int CLICK = 3;
float saveScale = 1f;
protected float origWidth, origHeight;
int oldMeasuredWidth, oldMeasuredHeight;

ScaleGestureDetector mScaleDetector;

Context context;

public TouchImageView(Context context) {
    super(context);
    sharedConstructing(context);
}

public TouchImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    sharedConstructing(context);
}

private void sharedConstructing(Context context) {
    super.setClickable(true);
    this.context = context;
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    matrix = new Matrix();
    m = new float[9];
    setImageMatrix(matrix);
    setScaleType(ScaleType.MATRIX);

    setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mScaleDetector.onTouchEvent(event);
            PointF curr = new PointF(event.getX(), event.getY());

            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                last.set(curr);
                start.set(last);
                mode = DRAG;
                break;

            case MotionEvent.ACTION_MOVE:
                if (mode == DRAG) {
                    float deltaX = curr.x - last.x;
                    float deltaY = curr.y - last.y;
                    float fixTransX = getFixDragTrans(deltaX, viewWidth,
                            origWidth * saveScale);
                    float fixTransY = getFixDragTrans(deltaY, viewHeight,
                            origHeight * saveScale);
                    matrix.postTranslate(fixTransX, fixTransY);
                    fixTrans();
                    last.set(curr.x, curr.y);
                }
                break;

            case MotionEvent.ACTION_UP:
                mode = NONE;
                int xDiff = (int) Math.abs(curr.x - start.x);
                int yDiff = (int) Math.abs(curr.y - start.y);
                if (xDiff < CLICK && yDiff < CLICK)
                    performClick();
                break;

            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                break;
            }

            setImageMatrix(matrix);
            invalidate();
            return true; // indicate event was handled
        }

    });
}

public void setMaxZoom(float x) {
    maxScale = x;
}

private class ScaleListener extends
        ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        mode = ZOOM;
        return true;
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        float mScaleFactor = detector.getScaleFactor();
        float origScale = saveScale;
        saveScale *= mScaleFactor;
        if (saveScale > maxScale) {
            saveScale = maxScale;
            mScaleFactor = maxScale / origScale;
        } else if (saveScale < minScale) {
            saveScale = minScale;
            mScaleFactor = minScale / origScale;
        }

        if (origWidth * saveScale <= viewWidth
                || origHeight * saveScale <= viewHeight)
            matrix.postScale(mScaleFactor, mScaleFactor, viewWidth / 2,
                    viewHeight / 2);
        else
            matrix.postScale(mScaleFactor, mScaleFactor,
                    detector.getFocusX(), detector.getFocusY());

        fixTrans();
        return true;
    }
}

void fixTrans() {
    matrix.getValues(m);
    float transX = m[Matrix.MTRANS_X];
    float transY = m[Matrix.MTRANS_Y];

    float fixTransX = getFixTrans(transX, viewWidth, origWidth * saveScale);
    float fixTransY = getFixTrans(transY, viewHeight, origHeight
            * saveScale);

    if (fixTransX != 0 || fixTransY != 0)
        matrix.postTranslate(fixTransX, fixTransY);
}

float getFixTrans(float trans, float viewSize, float contentSize) {
    float minTrans, maxTrans;

    if (contentSize <= viewSize) {
        minTrans = 0;
        maxTrans = viewSize - contentSize;
    } else {
        minTrans = viewSize - contentSize;
        maxTrans = 0;
    }

    if (trans < minTrans)
        return -trans + minTrans;
    if (trans > maxTrans)
        return -trans + maxTrans;
    return 0;
}

float getFixDragTrans(float delta, float viewSize, float contentSize) {
    if (contentSize <= viewSize) {
        return 0;
    }
    return delta;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    viewWidth = MeasureSpec.getSize(widthMeasureSpec);
    viewHeight = MeasureSpec.getSize(heightMeasureSpec);

    //
    // Rescales image on rotation
    //
    if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight
            || viewWidth == 0 || viewHeight == 0)
        return;
    oldMeasuredHeight = viewHeight;
    oldMeasuredWidth = viewWidth;

    if (saveScale == 1) {
        // Fit to screen.
        float scale;

    Drawable drawable = getDrawable();
          if (drawable == null || drawable.getIntrinsicWidth() == 0
                || drawable.getIntrinsicHeight() == 0)
            return;
        int bmWidth = drawable.getIntrinsicWidth();
        int bmHeight = drawable.getIntrinsicHeight();

        Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight);

        float scaleX = (float) viewWidth / (float) bmWidth;
        float scaleY = (float) viewHeight / (float) bmHeight;
        scale = Math.min(scaleX, scaleY);
        matrix.setScale(scale, scale);

        // Center the image
        float redundantYSpace = (float) viewHeight
                - (scale * (float) bmHeight);
        float redundantXSpace = (float) viewWidth
                - (scale * (float) bmWidth);
        redundantYSpace /= (float) 2;
        redundantXSpace /= (float) 2;

        matrix.postTranslate(redundantXSpace, redundantYSpace);

        origWidth = viewWidth - 2 * redundantXSpace;
        origHeight = viewHeight - 2 * redundantYSpace;
        setImageMatrix(matrix);
    }
    fixTrans();
}
}

activityfullscreenview.xml

<?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
   android:layout_height="match_parent"
  android:orientation="vertical" >

layoutfullscreenimage.xml

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

<info.androidhive.imageslider.helper.TouchImageView
    android:id="@+id/imgDisplay"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:scaleType="fitCenter" />

<Button
    android:id="@+id/btnClose"
    android:layout_width="wrap_content"
    android:layout_height="30dp"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_marginRight="15dp"
    android:layout_marginTop="15dp"
    android:paddingTop="2dp"
    android:paddingBottom="2dp"

    android:textColor="#ffffff"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:text="Close" />

    </RelativeLayout>

Thanks in advance.

2
  • post your TouchImageView class also. Commented Nov 15, 2014 at 9:16
  • show your xml and also mention package name.. Commented Nov 15, 2014 at 9:25

1 Answer 1

3

It seems that you add info.androidhive.imageslider.helper.TouchImageView in your layout_fullscreen_image xml file but your TouchImageView is in info.androidhive.listviewfeed.adapter package.So in layout_fullscreen_image file change

info.androidhive.imageslider.helper.TouchImageView

to

info.androidhive.listviewfeed.adapter.TouchImageView
Sign up to request clarification or add additional context in comments.

2 Comments

@NeeravShah happy to help,enjoy.
i knew this is the problem so i asked to post xml.. anyways your issue solved.. :)

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.