从一个类中获取 Intent 值并将 Intent 设置为另一个类

Posted

技术标签:

【中文标题】从一个类中获取 Intent 值并将 Intent 设置为另一个类【英文标题】:Getting Intent values from a class and set Intent to another class 【发布时间】:2021-08-16 17:06:08 【问题描述】:

大家好,有人可以帮助我了解如何进行此过程吗?我只是想在一个按钮上进行测试。假设:

点击btnEasy1后,会进入ButtonFunctions类,对GameActivity类进行必要的设置。

PS。我现在只在一个按钮上尝试这个(btnEasy1) 聚苯乙烯。该错误表明我正在尝试在空对象引用上调用虚拟方法。

ImageButton btnEasy1, btnEasy2, btnEasy3, btnEasy4, btnEasy5, btnEasy6, btnEasy7, btnEasy8, btnEasy9, btnEasy10, btnBack;
    int row = 0 , column = 0 , stage = 0;
    ButtonFunctions btnFunc;

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

        this.btnEasy1 = findViewById(R.id.btnEasy1);
        this.btnEasy2 = findViewById(R.id.btnEasy2);
        this.btnEasy3 = findViewById(R.id.btnEasy3);
        this.btnEasy4 = findViewById(R.id.btnEasy4);
        this.btnEasy5 = findViewById(R.id.btnEasy5);
        this.btnEasy6 = findViewById(R.id.btnEasy6);
        this.btnEasy7 = findViewById(R.id.btnEasy7);
        this.btnEasy8 = findViewById(R.id.btnEasy8);
        this.btnEasy9 = findViewById(R.id.btnEasy9);
        this.btnEasy10 = findViewById(R.id.btnEasy10);
        this.btnBack = findViewById(R.id.btnBack);

        //Easy Level intents
        Intent easyLevelIntent = new Intent(getApplicationContext(), GameActivity.class);

        btnBack.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Intent intent = new Intent(getApplicationContext(), Level_Selection.class);
                startActivity(intent);
                finish();
            
        );

        btnEasy1.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                btnFunc =new ButtonFunctions();
                btnFunc.functions("easy1");
                finish();
            
        );
public class ButtonFunctions extends AppCompatActivity 

    int row, column, stage;

    public void functions(String diffStage)
        Intent easyLevelIntent = new Intent(getApplicationContext(), GameActivity.class);

        if(diffStage.equals("easy1"))
            stage = 1 ;row = 2; column = 2 ;
            setRowCol(easyLevelIntent);
            startActivity(easyLevelIntent);
        
    
    private void setRowCol(Intent easyLevelIntent) 
        easyLevelIntent.putExtra("easyStageCount", stage);
        easyLevelIntent.putExtra("rowCount", row);
        easyLevelIntent.putExtra("colCount", column);
        easyLevelIntent.putExtra("difficulty", 1);
    
    Process: com.flip, PID: 10543
    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:106)
        at com.flip.Functions.ButtonFunctions.functions(ButtonFunctions.java:14)
        at com.flip.StageSelection.Level_Easy$2.onClick(Level_Easy.java:54)
        at android.view.View.performClick(View.java:5680)
        at android.view.View$PerformClick.run(View.java:22650)
        at android.os.Handler.handleCallback(Handler.java:836)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:203)
        at android.app.ActivityThread.main(ActivityThread.java:6364)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1076)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:937)

【问题讨论】:

【参考方案1】:

您已将ButtonFunctions 声明为扩展AppCompatActivity。但是这个类不是Activity,它只是一个实用类。您收到此 NullPointerException 是因为您使用 new 关键字创建了 Activity。这是不允许的。只有 Android 框架才能正确创建 Android 组件的新实例 (Activity, Service, Provider)。

您应该从ButtonFunctions 类声明中删除extends AppCompatActivity,并将Context 参数添加到任何需要的方法中。比如这个:

public void functions(Context context, String diffStage)
    Intent easyLevelIntent = new Intent(context, GameActivity.class);

    if(diffStage.equals("easy1"))
        stage = 1 ;row = 2; column = 2 ;
        setRowCol(easyLevelIntent);
        context.startActivity(easyLevelIntent);
    


另一种方法是将所有方法从ButtonFunctions 移动到您的Activity,因为它们似乎非常依赖它。但这是您需要做出的架构选择。

【讨论】:

以上是关于从一个类中获取 Intent 值并将 Intent 设置为另一个类的主要内容,如果未能解决你的问题,请参考以下文章

Android:intent.putExtra 在服务类中获取通知

尝试使用 Intent 获取字符串时未设置 .child()

如何获取接收到 Intent 的变量,使其成为静态变量,并将其发送到 Android 上的另一个类?

如何获取listView位置值并通过intent传递给另一个类

获取 ImageView 的图像并将其发送到带有 Intent 的活动

从 Fragment 创建 Intent 并将数据从 Intent 活动传回 Fragment(选项卡式应用程序)