当前位置: 首页 > 知识库问答 >
问题:

Android应用程序在RatingBar DialogFragment关闭后崩溃

哈沛
2023-03-14

我的应用程序的目的是通过一个自定义对话框从一个评级栏中检索一个值(5分),并将其显示在主activity的一个TextView中。当我点击我在下图中用红色勾勒出来的按钮时,应用程序崩溃并关闭。

该应用程序由2个类/活动组成。主activity和自定义对话框activity。

这两个文件的代码可以在下面找到:

mainactivity.java:

package com.example.mealrater;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements MealRaterDialog.SaveRating {

    public EditText restaurant, dish;
    public TextView ratingDisplay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        restaurant = findViewById(R.id.etRestaurant);
        dish = findViewById(R.id.etDish);

        RateMealButton();

    }

    @Override
    public void finishMealRaterDialog(String rating) {
        ratingDisplay = findViewById(R.id.tvRatingDisplay);
        ratingDisplay.setText(rating);
    }

    private void RateMealButton() {

        Button rate = findViewById(R.id.btnRate);
        rate.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                FragmentManager fm = getSupportFragmentManager();
                MealRaterDialog mealRaterDialog = new MealRaterDialog();
                mealRaterDialog.show(fm, "RateMeal");

            }
        });
    }
}

mealRaterDialog.java:

package com.example.mealrater;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RatingBar;
import androidx.fragment.app.DialogFragment;

public class MealRaterDialog extends DialogFragment {

    String rating;

    public interface SaveRating {
        void finishMealRaterDialog(String rating);
    }

    public MealRaterDialog() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        final View view = inflater.inflate(R.layout.meal_rater, container);
        getDialog().setTitle("Rate your meal");

        Button save = view.findViewById(R.id.btnSaveRating);
        save.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {

                RatingBar ratingBar = view.findViewById(R.id.rbMeal);
                rating = String.valueOf(ratingBar.getRating());
                SaveItem(String.valueOf(rating));

            }
        });
        return view;
    }

    private void SaveItem(String rating) {

        MealRaterDialog.SaveRating activity = (MealRaterDialog.SaveRating) getActivity();
        activity.finishMealRaterDialog(rating);
        getDialog().dismiss();

    }
}

我是Android Studio的新手,我也想知道如何改进这个问题。谢谢你。

Logcat错误:

2021-04-28 16:04:35.240 18144-18144/com.example.mealrater E/libc: Access denied finding property "ro.serialno"
2021-04-28 16:04:42.709 18144-18144/com.example.mealrater E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.mealrater, PID: 18144
    java.lang.NullPointerException: Attempt to invoke virtual method 'float android.widget.RatingBar.getRating()' on a null object reference
        at com.example.mealrater.MealRaterDialog$1.onClick(MealRaterDialog.java:35)
        at android.view.View.performClick(View.java:7448)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1119)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

共有1个答案

黄宏毅
2023-03-14

对此有很多修补方法。

首先,您应该在onclick之前定义ratingBar小部件。现在,当您每次单击按钮时,它都在创建变量。在按钮保存=view.findViewById(r.id.btnsaverating);行之后定义它。

其次,当您正在使用对话框片段时,应该在名为onViewCreated()的覆盖函数中调用单击的所有逻辑。而不是像现在这样在onCreateView()中。如果对你有用就告诉我。

 类似资料:
  • 问题内容: 每次我从Eclipse导出签名应用程序并将apk文件安装到手机上时,该应用程序都会崩溃。这仅在启用Proguard的情况下发生。 这是我的保护文件 我运行了adb logcat命令来检查崩溃报告。以下是我认为很重要的报告摘要: 第二段: 如果有人可以帮助我,我将非常感谢并接受您的回答。 更新: 所以我将这些添加到我的proguard文件中 现在启用Proguard时出现与Jackson

  • 我的应用程序在sdk 29下运行Material.io组件时不断崩溃。Im还将应用程序主题作为“theme.MaterialComponents.Light.NoActionBar”使用 Build.Gradle logcat

  • 在以前的代码上,谁医生帮了我 现在,android应用程序在我的手机上运行时崩溃了,这是错误日志 第一个问题是在我用相机扫描二维码后,它不能显示在二维码的结果进入 第二个问题是,我从存储器中选择了一个QRcode图像,然后点击确认,它崩溃了 下面是我认为的问题 类型不匹配:推断的类型是Uri?但乌里是意料之中的 冗余SAM构造函数 'onRequestPermissionsResult(Int,数

  • 我试图重新创建Connect四,我成功了。但我想通过频繁地切换颜色,给玩家一个获胜的四张光盘在哪里的指示。我对线程和编程中的时间概念是新的。 我也成功地给了用户这个指示,但是在关闭应用程序之后,控制台仍然会给出输出,也是在使用SetonCloserEquest时。 代码如下:

  • 经过测试,它在非android程序上工作,但在android上初始化后立即崩溃。日志cat也没有生成任何错误消息。我从CircularFifoBuffer找到了这个。 编辑2: 08-05 21:12:48.837:I//system/bin/batteryd(1189):1566474 v_bat 3.678(3.677),i_supply 0.500,i_demand 0.282=>v_bat

  • 我有问题关闭我的javaFX应用程序,当我点击关闭按钮从我的阶段,我的应用程序消失,但如果我寻找它在我的任务管理器我的应用程序仍然没有关闭。我尝试使用下面的代码强制关闭主线程和所有子线程,但是问题仍然存在。