Search code examples
androidimageviewandroid-viewpagerprojectlogcat

Android viewpager activity problems


I've been working on an Android activity which contains a ViewPager with 10 images on it and an Image View below which will display the image of the ViewPager upon click.

When I try to run it after entering through my login screen, the deal crashes.

I'm not sure where are the errors LogCat warns about so if you could help me out I'd be very grateful.

Here are the LogCat messages:

FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.logger.SecondActivity$MyPagerAdapter.setPrimaryItem (SecondActivity.java:80)
at android.support.v4.view.ViewPager.populate (ViewPager.java:1066)
at android.support.v4.view.ViewPager.populate (ViewPager.java:914)
at android.support.v4.view.ViewPager.onMeasure (ViewPager.java:1436)
at android.view.View.measure (View.java:15848)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:728)
at android.widget.RelativeLayout.onMeasure (RelativeLayout.java:477)
at android.view.View.measure (View.java:15848)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5012)
at com.android.internal.widget.ActionBarOverLayout.onMeasure(ActionBarOverLayout.java:302)
at android.view.View.measure (View.java:15848)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:5012)
at android.widget.FrameLayout.onMeasure (FrameLayout.java:310)
at android.view.View.measure (View.java:15848)

SecondActivity.java

package com.example.logger;

import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.view.ViewGroup;

public class SecondActivity extends Activity {

    private static final int NUM_PAGES = 10;

    private ViewPager mpager;

    private MyPagerAdapter mPagerAdapter;
    private int [] pics = {R.drawable.android_interfaz_layout_estructura_final, R.drawable.baixa, R.drawable.baixada, R.drawable.greenprogressbar,
            R.drawable.layout_keyboard, R.drawable.linerlay, R.drawable.merge1, R.drawable.o2zds, R.drawable.regbd,
            R.drawable.s7qrs};

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mPagerAdapter = new MyPagerAdapter(null);
        mpager = (ViewPager) findViewById(R.id.viewer);
        mpager.setAdapter (mPagerAdapter);
    }

    public void showImage (int position, View view)
    {
        //View is your view that you returned from instantiateItem 
        //and position is it's position in array you can get the image resource id 
        //using this position and set it to the ImageView
    }

    private class MyPagerAdapter extends PagerAdapter
    {

        SecondActivity activity;
        public MyPagerAdapter (SecondActivity activity){
            this.activity=activity;
        }


        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return pics.length;
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public Object instantiateItem(View collection, int position) {
            ImageView view = new ImageView (SecondActivity.this);
            view.setImageResource (pics[position]);
            ((ViewPager) collection).addView(view, 0);
            return view;
        }

        @Override
        public void setPrimaryItem (ViewGroup container, int position, Object object)
        {
            super.setPrimaryItem (container, position, object);
            activity.showImage(position,(View)object);
        }

        }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.second, menu);
        return true;
    }


    private OnClickListener mPageClickListener = new OnClickListener()
    {
     public void onClick (View v)
     {
        // TODO Auto-generated method stub
         //aquí anirà la funció per traslladar la image de la gallery a la pantalla
         Integer picId = (Integer) v.getTag();
         mpager.setVisibility(View.VISIBLE);
         mpager.setCurrentItem(v.getId());

     }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        // TODO Auto-generated method stub

    }

        };
}

End SecondActivity.java

Activity_Second.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".SecondActivity" >


    <android.support.v4.view.ViewPager
        android:padding="16dp"
        android:id="@+id/viewer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         android:layout_marginTop="10dp"
         android:layout_weight="0.30"
        />

    <ImageView 

        android:id="@+id/big_image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_below="@+id/viewer"
         android:layout_weight="0.70"

        />

</RelativeLayout>

End Activity_Second.xml

Just in case I'll add the MainActivity as well.

Main_Activity.java

package com.example.logger;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        attachHandlers();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    private void attachHandlers() {
        findViewById(R.id.login).setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        if(arg0.getId() == R.id.login)
        {
            Intent i = new Intent(this, SecondActivity.class);
            startActivity(i);    
        }

    }

}

End MainActivity.java

Activity_Main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity" >

        <Button
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/Login"
        android:layout_alignParentBottom="true"  
        android:background="@drawable/shapes"
        android:textColor="@color/text"
        />

    <EditText 
        android:id="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/input_u"
        android:layout_marginTop="10dp"
        android:textColor="@color/text"
        />

    <EditText 
        android:id="@+id/password"
        android:layout_below="@+id/username"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/input_p"
        android:layout_marginTop="10dp"
        android:textColor="@color/text"
        />

</RelativeLayout>

End Activity_Main.xml

I'd be very grateful if I could receive some insight into how to fix these problems.

Yours sincerely,

Mauro.


Solution

  • Change this

     mPagerAdapter = new MyPagerAdapter(null)
    

    to

     mPagerAdapter = new MyPagerAdapter(SecondActivity.this)
    

    The constructor looks like

     public MyPagerAdapter (SecondActivity activity){
                this.activity=activity; //activity is null
            }
    

    Most likely line 80 in SecondActivity.java is activity.showImage(position,(View)object); and activity is null.

    Change your Pageradapter code

      class MyPagerAdapter extends PagerAdapter{
    
            MyPagerAdapter (Context context) {
    
    
             }
    
            @Override
            public void destroyItem(View container, int position, Object object) {
                ((ViewPager) container).removeView((View) object);
            }
            @Override
            public int getCount() {
                return pics.length;
            }
    
            @Override
            public Object instantiateItem(View collection, int position) {
                ImageView iv =  new ImageView(SecondActivity.this);
                ((ViewPager) collection).addView(iv, 0);
                iv.setImageResource(pics[position]);
              return iv;
    
            }
    
            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view.equals(object);
            }
    
            }