片段中的片段接口不起作用

时间:2018-08-31 10:26:06

标签: android android-fragments interface

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

这是我要实现的目标: 我有一个MainActivity和一个BottomNavigationView。单击BottomNavigationView中的某个项目时,它将启动一个Fragment。这很好用,我可以将数据发送到一个片段,并具有一个界面来与我的活动进行对话。

问题是: 在我的最后一个片段(ProgramFragment)上,我想制作一个表单向导。因此,我想从ProgramFragment启动其他片段。我使用的方法与MainActivity中使用的方法相同,可以启动第一个片段(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)

有没有办法实现这一目标?为什么从活动而不是从片段开始工作?

这是片段RecStartFragment

的代码
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 个答案:

答案 0 :(得分:1)

您有一个空指针异常(NPE),指示字段public class MyTextBox : TextBox { public MyTextBox() { IsEnabledChanged += MyTextBox_IsEnabledChanged; } private void MyTextBox_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) { if(e.NewValue is bool) if (!(bool)e.NewValue) Text = string.Empty; } } 尚未初始化。

从代码中,您正在尝试初始化OnRecStartFragmentListener onRecStartFragmentListener中的字段并捕获异常,但不对它们执行任何操作:

onAttach()

尝试打印任何异常的堆栈跟踪:

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

e.printStackTrace()中传递的上下文是您的onAttach?如果是这样,是否实施MainActivity

答案 1 :(得分:0)

您应该在您的活动中实现该接口:

活动实施:

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");
    }


}