在开关情况下获取Toast的null对象引用错误



无论我做什么,当我试图在开关盒中调用toast时,我都会不断收到像null object reference这样的错误。switch方法所在的类扩展了FragmentActivity

我已尝试扩展Fragment/v4。和没有成功的活动。我还尝试在没有成功的情况下将getContext, getBaseContext, getAppliction();, getApplication().getBaseContext etc作为上下文传递给toast

如果我在MainActivity中创建一个公共Toast对象并像MainActivity.copyToast.show();这样使用它,它会起作用,但这个解决方案看起来不太好。

我想把它放在一行,如下:Toast.makeText(this.getApplicationContext(), "Copied to clipboard.", Toast.LENGTH_SHORT).show();

全班:

public class CustomTextSelectionMenu extends Fragment implements android.view.ActionMode.Callback {

@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
    MenuInflater inflater = mode.getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    menu.removeItem(android.R.id.selectAll);
    menu.removeItem(android.R.id.paste);

    return true;
}
@Override
public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
    return false;
}
@Override
public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
    int selectionStart = editText.getSelectionStart();
    int selectionEnd = editText.getSelectionEnd();
    if (selectionEnd > selectionStart) {
        Spannable str = editText.getText();
        boolean exists = false;
        StyleSpan[] styleSpans;
        switch (item.getItemId()) {

            //--------------------COPY----------------------------
            case android.R.id.copy:
                CharSequence charSequence =   editText.getText().subSequence(selectionStart, selectionEnd);
                ClipData clip = ClipData.newPlainText("simple text", charSequence);
                MainActivity.clipboard.setPrimaryClip(clip);

                Toast.makeText(getActivity().getApplicationContext(),  "Copied to clipboard.", Toast.LENGTH_SHORT).show();
                //MainActivity.copyToast.show();
                break;
            //--------------------BOLD----------------------------
            case R.id.bold:
                styleSpans = str.getSpans(selectionStart, selectionEnd, StyleSpan.class);
                // If the selected text-part already has BOLD style on it, then
                // we need to disable it
                for (int i = 0; i < styleSpans.length; i++) {
                    if (styleSpans[i].getStyle() == android.graphics.Typeface.BOLD) {
                        str.removeSpan(styleSpans[i]);
                        exists = true;
                    }
                }
                // Else we set BOLD style on it
                if (!exists) {
                    str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), selectionStart, selectionEnd,
                            Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
                }
                editText.setSelection(selectionStart, selectionEnd);

                break;     
        }
    }
    return true;
}

@Override
public void onDestroyActionMode(android.view.ActionMode mode) {

}
}

堆栈跟踪:

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:110)
at org.m.muddzboy.QuoteCreator.CustomTextSelectionMenu.onActionItemClicked(CustomTextSelectionMenu.java:182)
at android.widget.Editor$SelectionActionModeCallback.onActionItemClicked(Editor.java:3228)

第182行指向:

Toast.makeText(this.getApplicationContext(), "Copied to clipboard.", Toast.LENGTH_SHORT).show();

Toast方法会导致许多问题,我们必须解决它——这就是我回答这个问题的原因。

第一个上下文被调用为null,并像您的情况一样崩溃您的应用程序。

如何修复:关于创建方法保持上下文的引用

private Context mContext;
 @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
     mContext = getActivity()
}

第二,当显示toast可能是碎片被销毁时,如何确保它不会崩溃

public void showToast(String msg) {
        if (YOR_FRAGMENT.this.isVisible() && msg != null & mContext != null)
            Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show();
    }

这将使你远离吐司崩溃

希望这能帮助

我在下面的片段应用程序中使用Toast,它完全可以工作。

Context context;

查找根后查看

context = getActivity();
Toast.makeText(context, "Copied to clipboard.", Toast.LENGTH_SHORT).show();

如果使用片段,请使用以下代码。

Toast.makeText(getActivity(), "Copied to clipboard.", Toast.LENGTH_SHORT).show();

如果活动使用以下代码。

Toast.makeText(this, "Copied to clipboard.", Toast.LENGTH_SHORT).show();

如果您使用Fragment,您需要尝试Toast代码,如下所示:

Toast.makeText(getActivity(), "Copied to clipboard.", Toast.LENGTH_SHORT).show();

最新更新