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.
TouchImageViewclass also.