根据点击次数设置switch语句

时间:2018-06-14 20:27:31

标签: java android

我的应用程序崩溃,我认为这是由于SharedPreferencesManager prefManager = SharedPreferencesManager.getInstance(this);全局存储在Content类中。但是,如果我把它拿出来,那么我就不能在switch语句中进一步使用prefManager

我想使用prefManager中的点击次数来确定我的switch语句。我怎么能绕过这个?

public class Content extends AppCompatActivity {

    Button selectAnotherButton;

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

        final SharedPreferencesManager prefManager = SharedPreferencesManager.getInstance(this);

        selectAnotherButton = findViewById(R.id.button_select_another);

        selectAnotherButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                prefManager.increaseClickCount();

                for (int i = 0; i <= 100; i+=2) {
                    ShowRewardDialog();
                }
            }
        });

    private void ShowRewardDialog() {

        String message = "";
        //show dialog
        // set text based on an if statement you need to create

        switch (SharedPreferencesManager.getInstance(this).increaseClickCount()){

            case 2 :
                message = "You are rewarded with a video";
                break;
            case 4 :
                message = "You are rewarded with a the yellow smiley face in the homepage";
                break;
            case 6 :
                message = "You are rewarded with a video";
                break;
            case 8 :
                message = "You are rewarded with a the green smiley face in the homepage";
                break;
            case 10 :
                message = "You are rewarded with a video";
                break;
            case 12 :
                message = "You are rewarded with a the red smiley face in the homepage";
                break;
            case 14 :
                message = "You are rewarded with a video";
                break;
            default :
                message="";
        }

        // custom dialog
        final Dialog dialog = new Dialog(context);
        dialog.setContentView(R.layout.custom_dialog);

        SpannableString title = new SpannableString("YOU GAINED A REWARD");

        title.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.purple))
                , 0, title.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        // set the custom dialog components - text, image and button
        TextView text = dialog.findViewById(R.id.dialog_text);
        dialog.setTitle(title);

        text.setText(message);

        Button dialogButton = dialog.findViewById(R.id.dialog_button_OK);
        // if button is clicked, close the custom dialog
        dialogButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

        dialog.show();
    }

    }

堆栈追踪:

06-14 21:57:39.420 15488-15488/com.mima.chilltime E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.mima.chilltime, PID: 15488
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mima.chilltime/com.mima.chilltime.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2989)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3260)
        at android.app.ActivityThread.access$1000(ActivityThread.java:218)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1734)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:6934)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
        at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:111)
        at com.mima.chilltime.SharedPreferencesManager.<init>(SharedPreferencesManager.java:19)
        at com.mima.chilltime.SharedPreferencesManager.getInstance(SharedPreferencesManager.java:25)
        at com.mima.chilltime.MainActivity.<init>(MainActivity.java:25)
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at java.lang.Class.newInstance(Class.java:1690)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1094)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2979)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3260) 
        at android.app.ActivityThread.access$1000(ActivityThread.java:218) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1734) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:145) 
        at android.app.ActivityThread.main(ActivityThread.java:6934) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:372) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

2 个答案:

答案 0 :(得分:1)

尝试使用

SharedPreferencesManager.getInstance(getApplicationContext());

而不是使用this

答案 1 :(得分:0)

SharedPreferencesManager.getInstance(this); .... this中指特定活动(即全局)(即其生命周期与当前直接相关 context)。

另一方面,如果您明确需要引用应用程序的全局状态,则可以使用ApplicationContext

来自Android Documentation我的重点):

  

public Context getApplicationContext()

     

返回单个全局应用程序对象的上下文   目前的过程。这通常只应在需要的时候使用   生命周期与当前上下文分开的上下文,即   与流程的生命周期相关,而非当前组件

所以改为:

SharedPreferencesManager prefManager = SharedPreferencesManager.getInstance(getApplicationContext());