猿问

OnClickListener() 在 Fragment 中崩溃

由于某种原因,当我单击应用程序中的工具栏(工具栏)和浮动按钮(按钮)时,OnClickListener()方法使代码片段和应用程序崩溃


尽管ImageButton(OnOff)处理程序运行并且不会使片段崩溃


分段


public class ZnonkiFragment extends Fragment {

    private SharedPreferences settings;

    private ImageButton OnOff;

    private ViewPager viewPager;

    private DrawerLayout drawerLayout;

    private MainActivity.PagerAdapter pagerAdapter;

    private FloatingActionButton button;

    final Context context = getActivity();

    private androidx.appcompat.widget.Toolbar toolbar;

    private TabLayout tabLayout;

    private String ZvonOne, ZvonTwo;

    private List<Fragment> list = new ArrayList<>();

    private String url;


    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,

                             Bundle savedInstanceState) {

        View view =  inflater.inflate(R.layout.fragment_znonki, container,

       toolbar =  view.findViewById(R.id.toolbar);

       toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.menu));

       toolbar.setNavigationOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View view) {

               Toast.makeText(context,"lel",Toast.LENGTH_LONG).show();

           }

       });

        //...


       addListenerOnButton(view);

        return view;

    }


    public boolean checkString(String string) {

        try {

            Integer.parseInt(string);

        } catch (Exception e) {

            return false;

        }

        return true;

    }


    public void addListenerOnButton (final View viewOne){

        OnOff = viewOne.findViewById(R.id.onOff);

        button =  viewOne.findViewById(R.id.floatingActionButton);

        OnOff.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

               //...

        });



MM们
浏览 198回答 3
3回答

噜噜哒

我认为这个问题的主要原因是final Context context = getActivity();这是用在toolbar.setNavigationOnClickListener(new View.OnClickListener() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;@Override&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;public void onClick(View view) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Toast.makeText(context,"lel",Toast.LENGTH_LONG).show();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;});请注意 getActivity() 方法返回附加此片段的当前活动。并且您在片段对象在附加到活动之前创建时调用。您可以将上面的代码更改为:Context context;并将该方法重写为@Override&nbsp; &nbsp; public void onAttach(Context context) {&nbsp; &nbsp; &nbsp; &nbsp; super.onAttach(context);&nbsp; &nbsp; &nbsp; &nbsp; this.context = context;&nbsp; &nbsp; }希望这能回答您的问题。

守候你守候我

解决办法很简单在您的片段类文件中,不要创建用于调用单击事件的自定义函数,而是可以通过简单地在类文件中实现它们然后覆盖它来使用 android 的默认方法。这使得代码在将来更加简单和可重用。public class ZnonkiFragment extends Fragment implements View.OnClickListener, View.OnLongClickListener {    private SharedPreferences settings;    private ImageButton OnOff;    private ViewPager viewPager;    private DrawerLayout drawerLayout;    private FloatingActionButton button;    final Context context = getActivity();    private TabLayout tabLayout;    private String ZvonOne, ZvonTwo;    private List<Fragment> list = new ArrayList<>();    private String url;    private Toolbar mToolbar;    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        View view = inflater.inflate(R.layout.fragment_znonki, container, false);        mToolbar = view.findViewById(R.id.toolbar);        mToolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_launcher_background));        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Toast.makeText(context, "lel", Toast.LENGTH_LONG).show();            }        });        //...        OnOff = view.findViewById(R.id.onOff);        OnOff.setOnClickListener(this);        OnOff.setOnLongClickListener(this);        button = view.findViewById(R.id.floatingActionButton);        return view;    }    public boolean checkString(String string) {        try {            Integer.parseInt(string);        } catch (Exception e) {            return false;        }        return true;    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.onOff:                //call your onclick function here...                break;            case R.id.floatingActionButton:                //call your onclick function here...                break;        }    }    @Override    public boolean onLongClick(View view) {        switch (view.getId()) {            case R.id.floatingActionButton:                //call your long click function here...                break;        }        return false;    }}由于库导入不当,工具栏崩溃了。如果您尚未在 gradle 文件中使用 androidx 库,那么您可以使用简单的工具栏,即“import android.support.v7.widget.Toolbar”。这肯定会阻止工具栏上的 onclick 崩溃。如果有任何问题,请告诉我。谢谢。

森林海

你不需要这个:final Context context = getActivity();如果您需要访问 Fragment 中的上下文,您可以调用requireContext()如果您需要访问 Activity,您可以调用requireActivity()所以你的吐司消息可以变成:Toast.makeText(requireContext(),"lel",Toast.LENGTH_LONG).show();
随时随地看视频慕课网APP

相关分类

Java
我要回答