【问题标题】:Error on RadioGroup onCheckedChangeListenerRadioGroup onCheckedChangeListener 上的错误
【发布时间】:2016-05-15 03:53:59
【问题描述】:

我正在创建一个custom dialog fragment,里面有一个radiogroup。我在行中遇到错误

rdoGrp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()

正如我在研究中看到的,RadioGroup.OnCheckedChangeListener() 应该只是 OnCheckedChangeListener(),但 android studio 将其检测为错误并告诉修复方法是将其转换为 RadioGroup.OnCheckedChangeListener()

这是错误

致命异常:主要 进程:com.integritynet.lukslofts.services,PID:10341 java.lang.RuntimeException:无法启动活动 组件信息{com.integritynet.lukslofts.services/com.integritynet.lukslofts.services.main2}: java.lang.NullPointerException 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2429) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2493) 在 android.app.ActivityThread.access$800(ActivityThread.java:166) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5584) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 在 dalvik.system.NativeStart.main(本机方法) 引起:java.lang.NullPointerException 在 com.integritynet.lukslofts.services.fragment.layoutChooserFragment.onCreateView(layoutChooserFragment.java:39) 在 android.app.Fragment.performCreateView(Fragment.java:1700) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:890) 在 android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1062) 在 android.app.BackStackRecord.run(BackStackRecord.java:684) 在 android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1447) 在 android.app.Activity.performStart(Activity.java:5456) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2402) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2493) 在 android.app.ActivityThread.access$800(ActivityThread.java:166) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5584) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 在 dalvik.system.NativeStart.main(Native Method)

这是我的代码:

public class layoutChooserFragment extends DialogFragment {
    Context ctx;
    String rdo;
    public layoutChooserFragment(){

    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
        View vi = inflater.inflate(R.layout.layout_picker, container);
        getDialog().setTitle(R.string.txtLayoutChooser);

        final CheckBox cboRemember = (CheckBox)vi.findViewById(R.id.cboRemember);
        RadioGroup rdoGrp = (RadioGroup)vi.findViewById(R.id.rdoGrpPckr);
        final RadioButton rdoGrid = (RadioButton)vi.findViewById(R.id.rdoGrid);
        final RadioButton rdoTab   = (RadioButton)vi.findViewById(R.id.rdoTab);
        rdoGrp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                if (rdoTab.isChecked()) {
                    if (cboRemember.isChecked()) {
                        rdo = "tab";
                        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(ctx);
                        SharedPreferences.Editor editor = settings.edit();
                        editor.putString("chosenLayout", rdo);
                        editor.commit();
                        Log.d("tag", "chosenLayout: " + rdo);
                    }
                    Intent i = new Intent(ctx, MainActivity.class);
                    startActivity(i);
                } else if (rdoGrid.isChecked()) {
                    if (cboRemember.isChecked()) {
                        Intent i = new Intent(ctx, main2.class);
                        startActivity(i);
                        rdo = "grid";
                        SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(ctx);
                        SharedPreferences.Editor editor = settings.edit();
                        editor.putString("chosenLayout", rdo);
                        editor.commit();
                        Log.d("tag", "chosenLayout: " + rdo);
                    }
                    Intent i = new Intent(ctx, servicesGridStyle.class);
                    startActivity(i);
                }
            }
        });
        //dlg.show();
        return vi;

    }
}

这是布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp">

<RadioGroup
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/rdoGrpPckr">

    <RadioButton
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/txtTab"
        android:id="@+id/rdoTab"
        android:textSize="29sp" />

    <RadioButton
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:button="@null"
        android:drawableRight="@android:drawable/btn_radio"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/txtGrid"
        android:id="@+id/rdoGrid"
        android:textSize="29sp" />
</RadioGroup>

<CheckBox
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/txtRememberChoice"
    android:id="@+id/cboRemember"
    android:textSize="20sp" />
</LinearLayout>

【问题讨论】:

  • Caused by: java.lang.NullPointerException at com.integritynet.lukslofts.services.fragment.layoutChooserFragment.onCreateView(layoutChooserFragment.java:39) 检查这一行。你的布局中有R.id.rdoGrpPckr 吗?很可能找不到。
  • 是的,有它,这是我的布局
  • 你在滥用RadioGroup 的功能:/ 你得到了新检查的RadioButtonid - 为什么不使用它呢?喜欢switch(checkedId){case R.id.rdoGrid: //do stuff break; case R.id.rdoTab: //do other stuff break; }
  • 请发布您的 xml 布局....
  • 你的意思是我使用单选按钮进行验证并删除单选组。

标签: android android-studio radio-group


【解决方案1】:

问题的原因是您的布局中没有R.id.rdoGrpPckr。也许你有另一个 RadioGroup 但有一点不同的 id。检查您的布局 xml 并更正以解决您的问题。

另外请使用标准Java class naming conventions 作为您的类名LayoutChooserFragment。

【讨论】:

  • 很抱歉不太习惯类中的命名约定,你能建议一个合适的名字吗
【解决方案2】:

你必须使用

rdoGrp.setOnCheckedChangeListener(new OnCheckedChangeListener() {}

而不是

rdoGrp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {}

【讨论】:

  • android studio 告诉它一个错误,只使用 OnCheckedChangeListener() 我记得我有两个布局文件,一个在 layout 和 layout-sw600dp 中。 sw600dp 中的那个还没有更新。它仍然没有 rdoGrp 然后我添加了它,它终于起作用了。谢谢@Proverbio,你让我想起了,谢谢大家
【解决方案3】:

这是布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="5dp">

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/rdoGrpPckr">

        <RadioButton
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:button="@null"
            android:drawableRight="@android:drawable/btn_radio"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/txtTab"
            android:id="@+id/rdoTab"
            android:textSize="29sp" />

        <RadioButton
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:button="@null"
            android:drawableRight="@android:drawable/btn_radio"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/txtGrid"
            android:id="@+id/rdoGrid"
            android:textSize="29sp" />
    </RadioGroup>

    <CheckBox
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/txtRememberChoice"
        android:id="@+id/cboRemember"
        android:textSize="20sp" />
</LinearLayout>

【讨论】:

    【解决方案4】:

    我假设你正在覆盖

    @Override
            public void onCheckedChanged(RadioGroup group, int checkedId)
            {
    

    你的内部

    rdoGrp.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {}
    

    对吗?

    我正在检查我从 onCreate 调用自定义函数 setListeners(); 的应用程序,我在其中设置了所有侦听器。 你是从你那里调用这个函数吗?您的单选按钮是否已全局初始化?

    【讨论】:

    • 是的,所以我删除了@Override,我该怎么做?
    • 诺诺,你不必那样做。我只是问你是否在哪里做,因为这样做是正确的。
    • 我在 onCreateView 中声明了它。该侦听器位于 DialogFragment 中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 2023-03-15
    • 2019-01-29
    • 1970-01-01
    • 2015-06-03
    • 2012-03-12
    相关资源
    最近更新 更多