我遇到一个点击监听器的登录模式提交按钮的问题.
这是错误.
- Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
我有一个合理的理解,一个空指针异常是什么,我有一个类似于我的问题彻底搜索.我已经尝试以多种方式重新格式化点击监听器,确保我有正确的视图ID等.
- package...
- import...
- public class MainActivity extends ActionBarActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks {
- //Variables
- String currentPage = "";
- Stack<String> crumbs = new Stack<String>();
- //Fragment managing the behaviors,interactions and presentation of the navigation drawer.
- private NavigationDrawerFragment mNavigationDrawerFragment;
- // Used to store the last screen title. For use in {@link #restoreActionBar()}.
- public CharSequence mTitle;
- //temp
- AuthenticateUserTokenResult authenticateUserTokenResult;
- String loginErrorMessage = "";
- String loginErrorTitle = "";
- Boolean logonSuccessful = false;
- Dialog loginDialog;
- // Login EditTexts
- EditText Username;
- EditText CompanyID;
- EditText Password;
- Button Submit;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
- mTitle = getTitle(); // Set up the drawer.
- mNavigationDrawerFragment.setUp(R.id.navigation_drawer,(DrawerLayout) findViewById(R.id.drawer_layout));
- if(authenticateUserTokenResult == null) {
- attemptLogin();
- }
- }
- public void attemptLogin() {
- loginDialog = new Dialog(this,android.R.style.Theme_Translucent_NoTitleBar);
- loginDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
- loginDialog.setContentView(R.layout.login_modal);
- loginDialog.setCancelable(false);
- //loginDialog.setOnCancelListener(cancelListener);
- loginDialog.show();
- Submit = (Button)findViewById(R.id.Submit);
- Submit.setOnClickListener(new View.OnClickListener() // the error is on this line (specifically the .setOnClickListener)
- {
- @Override
- public void onClick(View v)
- {
- ClyxUserLogin user = new ClyxUserLogin();
- Username = (EditText)findViewById(R.id.Username);
- user.logon = Username.getText().toString();
- CompanyID = (EditText)findViewById(R.id.CompanyID);
- user.idCompany = Integer.parseInt(CompanyID.getText().toString());
- Password = (EditText)findViewById(R.id.Password);
- user.password = Password.getText().toString();
- user.idApplication = 142;
- authenticate(user);
- }
- });
- }
显而易见,但与我认为的话题无关.
以下是对话框的XML文件,其上有按钮.
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#3366FF">
- <RelativeLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerInParent="true"
- android:background="#FFFFFF" >
- <TextView
- android:id="@+id/LoginTitle"
- android:layout_width="200dp"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:layout_marginTop="10dp"
- android:layout_marginStart="10dp"
- android:textColor="#000000"
- android:textSize="20sp"
- android:text="Login" />
- <EditText
- android:id="@+id/Username"
- android:layout_width="200dp"
- android:layout_height="wrap_content"
- android:layout_below="@+id/LoginTitle"
- android:layout_margin="10dp"
- android:hint="Username" />
- <EditText
- android:id="@+id/CompanyID"
- android:layout_width="200dp"
- android:layout_height="wrap_content"
- android:layout_below="@+id/Username"
- android:layout_alignStart="@+id/Username"
- android:inputType="number"
- android:hint="Company ID" />
- <EditText
- android:id="@+id/Password"
- android:layout_width="200dp"
- android:layout_height="wrap_content"
- android:layout_below="@+id/CompanyID"
- android:layout_alignStart="@+id/Username"
- android:layout_marginTop="10dp"
- android:layout_marginBottom="10dp"
- android:inputType="textPassword"
- android:hint="Password" />
- <Button
- android:id="@+id/Submit"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@+id/Password"
- android:layout_marginBottom="10dp"
- android:layout_centerHorizontal="true"
- android:text="Login" />
- </RelativeLayout>
- </RelativeLayout>
任何帮助将不胜感激.
解决方法
Submit是null,因为它不是activity_main.xml的一部分
当您在Activity中调用findViewById时,将在Activity的布局中查找一个View.
改为:
- Submit = (Button)loginDialog.findViewById(R.id.Submit);
另一件事:你使用
- android:layout_below="@+id/LoginTitle"
但你想要的是可能的
- android:layout_below="@id/LoginTitle"
请参阅this question关于@id和@ id之间的区别.