我正在制作一个简单的片段通信应用程序但是当我运行应用程序时它会说
Attempt to invoke interface method 'void com.example.owner.fragcom.fragment_one$OnnamesetListener.setname(java.lang.String)' on a null object reference
我认为使用setname方法的问题,但我确实不会出现什么问题,任何人都可以告诉我这是我在下面粘贴代码的问题。
public class fragment_one extends Fragment {
EditText etd;
Button button;
OnnamesetListener onnamesetListener;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_one_layout,container,false);
etd = (EditText)view.findViewById(R.id.frag_one);
button =(Button)view.findViewById(R.id.send);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = etd.getText().toString();
onnamesetListener.setname(name);
}
});
return view;
}
public interface OnnamesetListener{
public void setname(String name);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
onnamesetListener = (OnnamesetListener) context;
}catch (Exception e){}
}
}
这是我的片段1的代码,我设置了一个编辑文本,并通过主要活动将该值传递给片段2。
主要活动
public class MainActivity extends AppCompatActivity implements fragment_one.OnnamesetListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void setname(String name) {
fragment_two f2 =(fragment_two) getFragmentManager().findFragmentById(R.id.fragment_two);
f2.UpdateInfo(name);
}
}
片段二
public class fragment_two extends Fragment {
TextView textView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_two_layout,container,false);
textView = (TextView)view.findViewById(R.id.textView);
return view;
}
public void UpdateInfo(String name)
{
textView.setText(name);
}
}
任何人都可以告诉我为什么我遇到这种类型的错误以及我在代码中做了哪些更改的问题。 任何建议都是受欢迎的。
答案 0 :(得分:0)
错误是说你的onnamesetListener为null,这意味着它从未在OnAttach方法上获得引用。
我建议不要将你的问题留空,因为你不知道你的监听器是否成功附加,请尝试下面的代码,看看它是否告诉你监听器为空的原因。
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnnamesetListener ) {
onnamesetListener = (OnnamesetListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnnamesetListener");
}
}
答案 1 :(得分:0)
我的主要活动我无法看到你在哪里附加了fragment_one如果它没有附加onAttach方法就不会被调用如果你附加的话,听众将为null见。