Android Edittext:尝试在空对象引用上调用接口方法

Android Edittext: Attempt to invoke interface method on a null object reference

当我运行下面的代码时,永远找不到编辑文本中的用户名。我已经使用和不使用用户名进行了测试,但是当单击按钮时,它会向事件监听器发送一个空对象。我是 android 的新手,很困惑为什么当用户名 edittext 包含用户名时它不返回字符串。

public class LoginFragment extends Fragment {

public static final String TAG = LoginFragment.class.getSimpleName();
public  EditText username = null;
public View root = null;

public interface eventListener {
    void someEvent(String s);
}

eventListener eventListener;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    root = inflater.inflate(R.layout.login_splashpage, null, false);
    username = (EditText) root.findViewById(R.id.login_username);
    Button login_button = (Button) root.findViewById(R.id.login_button);
    login_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String usernameString = username.getText().toString();
            Log.d(TAG, "Button Clicked" + usernameString);
            if (!usernameString.isEmpty()) {
                eventListener.someEvent(usernameString);
            } else {
                Snackbar.make(root, "No username provided. Try again", Snackbar.LENGTH_SHORT).show();
            }
        }
    });

    return root;
}

}

无论如何,感谢您的帮助和时间

我认为问题出在这一行

eventListener.someEvent(usernameString);

没有初始化接口eventListener的地方,你能做这样的事情吗?

eventListener ev = new eventListener(){
void someEvent(usernameString);
}

eventListener 为空,这就是您得到 NullPointerException 的原因。

由于原始接口仅提供有关派生 class 应该做什么的契约,您还必须创建其背后的逻辑:

private interface eventListener {
  void onEvent(String string);
}

eventListener listener = new eventListener() {
  @Override
  public void onEvent(String string) {
    Log.e(TAG, "onEvent " + string);
  }
};

我不确定你是否想要一个接口,因为一个简单的方法就可以做到:

public void onLogin(String username) {
  Log.e(TAG, "onLogin " + username)
}