删除按钮一点击就闪退,怎么回事?

删除按钮一点击就闪退,怎么回事?

http://img1.sycdn.imooc.com//climg/5caabfc40001c3b211990768.jpg

http://img1.sycdn.imooc.com//climg/5caabfc4000129cb11640764.jpg

图一为用switch case方式界面没出来就闪退,所以两个按钮都不行;图二为在布局添加onClick方法在点击删除按钮时闪退,回退按钮可以用。

正在回答

登陆购买课程后可参与讨论,去登陆

5回答

你是说

http://img1.sycdn.imooc.com//climg/5cac7777000178f605980600.jpg

R.id.user可以监听成功,而R.id.back监听不成功吗?你测试一下,能不能监听到事件,你给88行换个别的代码,例如Toast显示一个字符串,如果显示不出来,则证明,你的xml中,与你写的id不统一。如果能监听到,则证明88到93行代码的问题。你需要缩小范围排查。

  • LexieMIZUKI 提问者 #1
    我换成了toast试了一下,还是不行,而且我看了几遍id是统一的,然后运行的时候报错就一直说back.setOnClickListener(this);这行空指针
    2019-04-12 14:58:12
  • 好帮手慕雪 回复 提问者 LexieMIZUKI #2
    换成了toast也是,没有toast显示,对不对?那就证明没有监听成功啊。back为空了。你要在back“back.setOnClickListener(this);”之前,判断一下back是不是为空了。你确定R.layout.activity_main中有back吗?它为空,肯定是不能back.setOnClickListener(this)的
    2019-04-12 15:04:35
  • LexieMIZUKI 提问者 回复 好帮手慕雪 #3
    我的activity_main布局里没有,我是把back控件写在它所在的fragment里面的
    2019-04-12 15:34:21
提问者 LexieMIZUKI 2019-04-18 16:26:18
提问者 LexieMIZUKI 2019-04-12 19:45:56
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;

import com.lexieluv.imooc_note.MainActivity;
import com.lexieluv.imooc_note.R;

public class plus_fragment extends Fragment {
    private ImageButton back;
    private ImageButton clear;

    private EditText title;
    private EditText content;
//    Context context;

//    protected all_fragment af = new all_fragment();
//    protected plus_fragment pf = new plus_fragment();
//    protected user_fragment uf = new user_fragment();
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.plus_fragment,container,false);
//        this.getSupportFragmentManager()
//                .beginTransaction()
//                .add(R.id.container_content,af)
//                .add(R.id.container_content,pf)
//                .hide(pf)
//                .add(R.id.container_content,uf)
//                .hide(uf)
//                .commit();
    }

    @Override
    public void onActivityCreated(@Nullable Bundle saveInstanceState) {
        super.onActivityCreated(saveInstanceState);
        initView();

    }
    private void initView() {
        title = getView().findViewById(R.id.title);
        content = getView().findViewById(R.id.content);
        clear = clear.findViewById(R.id.clear);
        back = back.findViewById(R.id.back);
        clear.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                title.setText("");
                content.setText("");
            }
        });

        back.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent backk=new Intent(getActivity(),MainActivity.class);
                startActivity(backk);
//                this.getSupportFragmentManager()
//                        .beginTransaction()
//                        .show(af)
//                        .hide(pf)
//                        .hide(uf)
//                        .commit();
            }
        });
    }

}

http://img1.sycdn.imooc.com//climg/5cb07a690001a8f911010763.jpg

  • 你给的信息不全,贴全一些哈,否则看不哪里出问题了。另外需要注意plus_fragment对应的R.layout.plus_fragment有没有那些控件呢?有的话才可以用哈。FragmentManager注意一下用的哪个包,要与MainActivity,整个项目都一致,统一下。
    2019-04-14 10:30:44
  • 提问者 LexieMIZUKI 回复 好帮手慕雪 #2
    老师我发现plus_fragment里面导入的是import android.support.v4.app.FragmentManager;然后MainActivity里面没有导入任何fragmentManager的包是因为本身有吗? 还有就是我发现MainActivity里面的是this.getSupportFragmentManager,所以我把plus_fragment里面的改成了MainActivity.getSupportFragmentManager.但还是会报错,不过之前是前面标红,现在是后面这部分标红了。
    2019-04-15 10:23:23
  • 好帮手慕雪 回复 提问者 LexieMIZUKI #3
    1)你要整个项目import一致。包括Fragment也是一样的。你都用成import android.support.v4.app.FragmentManager;包中的,或者都用成import android.app.FragmentManager;要统一。2)MainActivity中没有导入包,是因为没有用FragmentManager对象来接收它吧?用来对象来接收一下,导一下包。
    2019-04-15 11:56:46
提问者 LexieMIZUKI 2019-04-09 18:23:36
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;

import com.lexieluv.imooc_note.fragment.all_fragment;
import com.lexieluv.imooc_note.fragment.plus_fragment;
import com.lexieluv.imooc_note.fragment.user_fragment;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    protected ImageButton all;
    protected ImageButton plus;
    protected ImageButton user;

    private ImageButton back;
    private ImageButton clear;
    private EditText title;
    private EditText content;

    protected all_fragment af = new all_fragment();
    protected plus_fragment pf = new plus_fragment();
    protected user_fragment uf = new user_fragment();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.container_content,af)
                .add(R.id.container_content,pf)
                .hide(pf)
                .add(R.id.container_content,uf)
                .hide(uf)
                .commit();
        initView();
    }

    private void initView() {
        all = this.findViewById(R.id.all);
        plus = this.findViewById(R.id.plus);
        user = this.findViewById(R.id.user);

        back = this.findViewById(R.id.back);
        clear = this.findViewById(R.id.clear);
//        title = this.findViewById(R.id.title);
//        content = this.findViewById(R.id.content);
//        back.setOnClickListener(this);
//        clear.setOnClickListener(this);

        all.setOnClickListener(this);
        plus.setOnClickListener(this);
        user.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.all:
                this.getSupportFragmentManager()
                        .beginTransaction()
                        .show(af)
                        .hide(pf)
                        .hide(uf)
                        .commit();
                break;
            case R.id.plus:
                this.getSupportFragmentManager()
                        .beginTransaction()
                        .show(pf)
                        .hide(af)
                        .hide(uf)
                        .commit();
                break;
            case R.id.user:
                this.getSupportFragmentManager()
                        .beginTransaction()
                        .show(uf)
                        .hide(pf)
                        .hide(af)
                        .commit();
                break;
//            case R.id.back:
//                this.getSupportFragmentManager()
//                        .beginTransaction()
//                        .show(af)
//                        .hide(pf)
//                        .hide(uf)
//                        .commit();
//                break;
//            case R.id.clear:
//                title.setText("");
//                content.setText("");
//                break;
        }
    }

    public void backClick(View view){
        this.getSupportFragmentManager()
                .beginTransaction()
                .show(af)
                .hide(pf)
                .hide(uf)
                .commit();
    }

    public void clearClick(View view){
        title = findViewById(R.id.title);
        content = findViewById(R.id.content);
        title.setText("");
        content.setText("");
    }
}


好帮手慕雪 2019-04-08 15:31:57

你的back和title控件在50行和113行之前都是null吧?你可右增加判断,如果不为空再去设置监听或修改显示内容。如果是null,那你就需要跟踪一下代码为什么为空了,是在setContentView(R.layout.XXXX);之前调用了,还是xml设置错了。祝:学习愉快

  • 提问者 LexieMIZUKI #1
    第二种在xml里面设置onClick方法我已经实现了,是需要在activity中对应的void方法中绑定控件,不能首先在initView中绑定(这里我不懂为什么?请问老师知道吗?)。 第一种直接在activity中setlistener的方式还是不行,如果老师可以帮我解决第一种为什么不行就帮帮我吧,不行就算了。
    2019-04-09 09:29:52
  • 好帮手慕雪 回复 提问者 LexieMIZUKI #2
    1)“不能首先在initView中绑定”是因为你得把控件实例化之后才能使用它的方法,否则就会出现空指针异常。2)”第一种为什么不行“你提把代码给粘贴全一点,才能知道你哪里错了,从log上只能是看出空指针了,猜测就是我们上面说的那几种情况。你自己根据我的推断测试一下,或者粘贴一下代码。
    2019-04-09 10:09:36
  • 提问者 LexieMIZUKI 回复 好帮手慕雪 #3
    好的,谢谢老师,我把全部代码发在上面了,注释掉的有些是第一种方法的就没用,因为不成功现在用的第二种。
    2019-04-09 18:24:46
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师