代码之家  ›  专栏  ›  技术社区  ›  Julian Hardenne

片段中的片段接口不工作

  •  0
  • Julian Hardenne  · 技术社区  · 6 年前

    我在Android开发中遇到了一些问题。环境设置为在min API 23中运行。

    这就是我努力实现的目标: 我有一个 MainActivity 用一个 BottomNavigationView 底部导航视图 点击它就会启动一个片段。这工作得很好,我可以发送数据到一个片段,并有一个与我的活动对话的接口。

    ProgramFragment 程序片段 . 我用的方法和我在电影里用的一样 主要活动 RecStartFragment )在布局中有一个按钮。我希望当按钮被点击时,下一个片段( RecDataPatientFragment )如图所示。当我点击按钮时,我得到一个错误,说:

    java.lang.NullPointerException: Attempt to invoke interface method 
    'void x.RecStartFragment$OnRecStartFragmentListener.startRecProg()' 
    on a null object reference at 
    x.RecStartFragment$1.onClick(RecStartFragment.java:30)
    

    有没有办法做到这一点?为什么它是从一个活动而不是从一个片段工作?

    这是片段的代码 重新开始碎片

    package x;
    
    import android.app.Fragment;
    import android.content.Context;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    
    public class RecStartFragment extends Fragment {
        private static final String TAG = RecStartFragment.class.getName();
        private View v;
        OnRecStartFragmentListener onRecStartFragmentListener;
    
        private Button btnStartRec;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            if(v != null) {
                return v;
            }
            v = inflater.inflate(R.layout.fragment_rec_start, null);
            btnStartRec = v.findViewById(R.id.btn_start_rec);
            btnStartRec.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    onRecStartFragmentListener.startRecProg();
                }
            });
            return v;
        }
    
        public interface OnRecStartFragmentListener
        {
            public void startRecProg();
        }
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            try {
                onRecStartFragmentListener = (OnRecStartFragmentListener) context;
            } catch (Exception e)
            {
    
            }
        }
    

    2 回复  |  直到 6 年前
        1
  •  1
  •   veritas1    6 年前

    您有一个空指针异常(NPE),指示字段 OnRecStartFragmentListener onRecStartFragmentListener 尚未初始化。

    从代码中,您正在尝试初始化中的字段 onAttach() 捕捉异常,但不处理它们:

    @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            try {
                onRecStartFragmentListener = (OnRecStartFragmentListener) context;
            } catch (Exception e)
            {
    
            }
        }
    

    e.printStackTrace()

    传入的上下文 onAttach 是你的 MainActivity ? 如果是的话,它是否在实施 OnRecStartFragmentListener ?

        2
  •  0
  •   Juanjo Berenguer    6 年前

    活动实施:

    public class MainActivity extends AppCompatActivity implements RecStartFragment.OnRecStartFragmentListener{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            loadFragment();
        }
    
        @Override
        public void startRecProg() {
            //Do whatever you need do here.
            Log.e("Calback:","Interface is working");
        }
    
    
    }