2

I just started an app for a project which I wanted to have an into slider for. I got everything working except for the page dots, which do not display when the IntroSlider activity, the activity which displays all of the slides, is launched, and crashes the application when trying to go to the next slide. I don't understand what is causing the error, I would appreciate any help. Look for the comment in IntroSlider.java which specifies the line number that Android Studio says is causing the error. Thank you

IntoSlider.java:

 package com.businessbrains.businessbrains.Activities;

import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.businessbrains.businessbrains.Adapters.SlidesAdapter;
import com.businessbrains.businessbrains.Internals.PreferenceManager;
import com.businessbrains.businessbrains.R;

 public class IntroSlider extends AppCompatActivity implements View.OnClickListener{

        private ViewPager mPager;
        private int[] layouts = {R.layout.slide_welcome, R.layout.slide_account, R.layout.slide_selftest, R.layout.slide_mutliplayer};
        private SlidesAdapter slidesAdapter;
        private LinearLayout Dots_Layout;
        private ImageView[] dots;
        private Button skipBtn, nextBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(new PreferenceManager(this).isSlidesEnabled()){
            loadLogin();
        }

        if(Build.VERSION.SDK_INT >= 19){
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        } else{
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
        setContentView(R.layout.activity_intro_slider);

        mPager= (ViewPager) findViewById(R.id.viewPager);
        slidesAdapter = new SlidesAdapter(layouts, this);
        mPager.setAdapter(slidesAdapter);
        Dots_Layout = findViewById(R.id.dotsLayout);
        nextBtn = (Button) findViewById(R.id.nextBtn);
        nextBtn.setOnClickListener(this);
        skipBtn = (Button) findViewById(R.id.skipBtn);
        skipBtn.setOnClickListener(this);


        mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {
            }

            @Override
            public void onPageSelected(int i) {
                    createDots(i);
                    if(i==layouts.length-1){
                        nextBtn.setText("Start");
                        skipBtn.setVisibility(View.INVISIBLE);
                    }
                    else{
                        nextBtn.setText("Next");
                        skipBtn.setVisibility(View.VISIBLE);
                    }
            }

            @Override
            public void onPageScrollStateChanged(int i) {
            }
        });
    }

    private void createDots(int current_position){
        if(Dots_Layout!=null){
            Dots_Layout.removeAllViews();
        }
        dots = new ImageView[layouts.length];
        for(int i = 0; i < layouts.length; i++){
            if(i==current_position){
                dots[i].setImageDrawable((Drawable)ContextCompat.getDrawable(getApplicationContext(), R.drawable.accessory_active_dots));
            }
            else{
                dots[i].setImageDrawable((Drawable)(ContextCompat.getDrawable(getApplicationContext(), R.drawable.accessory_inactive_dots)));
                //line which is causing the error
            }
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            params.setMargins(4,0,4,0);
            Dots_Layout.addView(dots[i], params);
        }
    }

     @Override
     public void onClick(View view) {
        switch(view.getId()){
            case R.id.nextBtn:
                loadNextSlide();
                break;
            case R.id.skipBtn:
                loadLogin();
                new PreferenceManager(this).writeDisableSlides();
                break;
        }
     }

     private void loadLogin(){
        startActivity(new Intent(this, LoginOptionsActivity.class));
        finish();
     }

     private void loadNextSlide(){
        int nextslide = mPager.getCurrentItem() + 1;
        if(nextslide < layouts.length){
            mPager.setCurrentItem(nextslide);
        }
        else{
            loadLogin();
            new PreferenceManager(this).writeDisableSlides();
        }
     }
 }

the corresponding .xml, activity_into_slider.xml:

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


    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/viewPager"
        />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:alpha=".5"
        android:layout_above="@+id/dotsLayout"
        android:background="@android:color/white"
        android:layout_marginBottom="15dp"
    ></View>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/dotsLayout"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal"
        android:gravity="center"
        android:layout_marginBottom="55sp"
    />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Skip"
        android:textSize="16sp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:background="@android:color/transparent"
        android:id="@+id/skipBtn"
        android:layout_marginBottom="8dp"
        android:textColor="@android:color/white"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Next"
        android:textSize="16sp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="@android:color/transparent"
        android:id="@+id/nextBtn"
        android:layout_marginBottom="8dp"
        android:textColor="@android:color/white"
        />
</RelativeLayout>

One of the slides:

<?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"
    android:background="@color/colorSlide_welcome">

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/ic_welcome"
        android:layout_centerHorizontal="true"
        android:scaleType="centerCrop"
        android:layout_marginTop="150dp"
        android:id="@+id/img"
        android:tint="@android:color/black"
        />

    <TextView
        android:layout_width="132dp"
        android:layout_height="100dp"
        android:text="@string/slide1title"
        android:textColor="@android:color/white"
        android:textSize="30sp"
        android:textStyle="bold"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/img"
        android:layout_marginTop="12dp"
        android:id="@+id/slidetitle"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/slide1desc"
        android:textColor="@android:color/white"
        android:textSize="18sp"
        android:gravity="center_horizontal"
        android:layout_below="@+id/slidetitle"
        android:layout_marginTop="10dp"
        android:id="@+id/slide_desc"
        android:layout_marginRight="40sp"
        android:layout_marginLeft="40sp"
        />




</RelativeLayout>

The error which is being thrown:

07-11 00:30:30.253 6010-6010/com.businessbrains.businessbrains E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.businessbrains.businessbrains, PID: 6010
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageDrawable(android.graphics.drawable.Drawable)' on a null object reference
        at com.businessbrains.businessbrains.Activities.IntroSlider.createDots(IntroSlider.java:89)
        at com.businessbrains.businessbrains.Activities.IntroSlider.access$000(IntroSlider.java:21)
        at com.businessbrains.businessbrains.Activities.IntroSlider$1.onPageSelected(IntroSlider.java:62)
        at android.support.v4.view.ViewPager.dispatchOnPageSelected(ViewPager.java:1947)
        at android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:686)
        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:670)
        at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:631)
        at android.support.v4.view.ViewPager.setCurrentItem(ViewPager.java:612)
        at com.businessbrains.businessbrains.Activities.IntroSlider.loadNextSlide(IntroSlider.java:118)
        at com.businessbrains.businessbrains.Activities.IntroSlider.onClick(IntroSlider.java:101)
        at android.view.View.performClick(View.java:6256)
        at android.view.View$PerformClick.run(View.java:24701)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

accessory_active_dots.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="oval"
        android:useLevel="true"
        android:dither="true">

    <size android:height="8dp" android:width="8dp"/>
    <solid android:color="@color/active_dots"/>

</shape>

accessory_inactive_dots.xml:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    android:useLevel="true"
    android:dither="true">

    <size android:height="8dp" android:width="8dp"/>
    <solid android:color="@color/inactive_dots"/>

</shape>
nellyv
  • 21
  • 2

1 Answers1

1

dots = new ImageView[layouts.length]; creates an array of size layouts.length but all the elements of the array are null.

So when you invoke setImageDrawable(..) on dots[i], you are actually invoking the method setImageDrawable(..) on a null object.

Fix: initialize dots[i] (i.e., dots[i] =) with a non-null value before use. For example, do dots[i] = new ImageView() before you invoke setImageDrawable(..) on dots[i].

Sazzadur Rahaman
  • 6,938
  • 1
  • 30
  • 52