2015-01-28 12 views
16

Mam problem z odbiornikiem kliknięcia dla przycisku wysyłania modalnego logowania.Wskaźnik zerowy Wyjątek dla .setOnClickListener

To jest błąd.

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference 

Mam rozsądne zrozumienie, co jest wyjątek wskaźnik pusty i szukam dokładnie dla problemu podobnego do mojego. Próbowałem sformatować kliknij słuchacza na kilka sposobów, upewnił się, że masz poprawny identyfikator widoku itp

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

jest więcej, oczywiście, ale nie odnosi się do tematu, myślę. Oto plik XML dla okna dialogowego, w którym znajduje się przycisk.

<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> 

Każda pomoc zostanie bardzo doceniona.

+9

Wracamy tutaj prawie rok później i dobrze się czuje, jak wiele poprawiłem i wychodzę z głupich błędów, takich jak ten. Każdy zaczyna gdzieś i uwielbiam to, że Stack będzie Cię wspierał na każdym kroku. –

Odpowiedz

47

Submit jest null ponieważ nie jest częścią activity_main.xml

Gdy zadzwonisz pod numer findViewById w numerze Activity, w panelu Aktywność będzie wyglądać View.

spróbować zamiast:

Submit = (Button)loginDialog.findViewById(R.id.Submit); 

jeszcze jedno: używasz

android:layout_below="@+id/LoginTitle" 

ale co chcesz, to prawdopodobnie

android:layout_below="@id/LoginTitle" 

Zobacz this question o różnicy między @id i @+id.

+2

Dziękuję, dobry nawyk, aby wejść, zamiast kopiować wklejanie innych identyfikatorów. Nie rozumiałem znaczenia znaku + przed. Nigdy nie myślałem o tym. (Dodano jako zaakceptowany dla nieco bardziej rozwiniętej odpowiedzi i trochę dodatkowej pomocy) –

8

android.widget.Button.setOnClickListener (android.view.View $ OnClickListener)” na null odniesienia obiektu

Ponieważ Submit przycisk jest wewnątrz login_modal więc trzeba użyć loginDialog widok na dostęp przycisk:

Submit = (Button)loginDialog.findViewById(R.id.Submit); 
+2

Wow jak tego nie widziałem. Myślę, że to dlatego, że wyjątek wskazuje na linię poniżej. Dzięki za pomoc –

0

Spróbuj dając swój przycisk w main.xml bardziej opisowej nazwy, takie jak:

<Button 
       android:id="@+id/buttonXYZ" 

(stosowanie małych liter w plikach XML, przynajmniej pierwszą literę)

a potem w swojej klasa główną działalność, zadeklarować ją jako:

Button buttonXYZ;

W metodzie swojej onCreate (Bundle savedInstanceState), definiują ją jako:

buttonXYZ = (Button) findViewById(R.id.buttonXYZ); 

Przenieś również przyciski/TextViews na zewnątrz i umieść je przed .setOnClickListener - powoduje to czyszczenie kodu.

Username = (EditText)findViewById(R.id.Username); 
CompanyID = (EditText)findViewById(R.id.CompanyID);