我在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)
{
}
}
提前谢谢!
答案 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");
}
}