【问题标题】:Fragment Interface in fragment not working片段中的片段接口不起作用
【发布时间】:2019-02-06 08:50:18
【问题描述】:

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

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

问题是: 在我的最后一个片段 (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)
        {

        }
    }

提前谢谢你!

【问题讨论】:

    标签: android android-fragments interface


    【解决方案1】:

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

    活动实施:

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

    【讨论】:

    • 这与 Veritas1 提出的解决方案相同,并且运行良好!谢谢你们的帮助!
    【解决方案2】:

    您有一个空指针异常 (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

    【讨论】:

    • 我添加了 printStackTrace 并收到此消息:System.err: java.lang.ClassCastException: x.MainActivity cannot be cast to x.RecStartFragment$OnRecStartFragmentListener at x.RecStartFragment.onAttach(RecStartFragment.java:45)。所以我认为错误实际上来自传递的上下文问题。但是如果是 Activity ,我该怎么做才能传递片段的上下文而不是那个?
    • @JulianHardenne 这就是问题所在。 ConnectActivity需要实现RecStartFragment .OnRecStartFragmentListener
    • 哦。所以即使RecStartFragmentProgramFragment的一部分,接口也必须由父Activity实现,而不是由父Fragment实现。当我写这些行时,这似乎是合乎逻辑的,因为我记得在 Android Doc 中看到您需要使用 Activity 来在多个 Fragment 之间进行对话。
    • @JulianHardenne 情况通常如此......这取决于。您正在尝试从 Context 投射。 ActivityContextFragment 不是。但是,如果您使用子片段管理器从父片段启动片段,那么在onAttach() 中您将执行类似onRecStartFragmentListener = (OnRecStartFragmentListener) getParentFragment() 的操作 - 假设父片段实现了该接口。
    • 好的;所以这个解决方案解决了我的问题,我现在可以通过在我的父活动上实现接口来访问第二个片段!非常感谢您的帮助和解释!!!
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多