web-dev-qa-db-ja.com

.setOnClickListenerでのNULLポインター例外

ログインモーダル送信ボタンのクリックリスナーに問題があります。

これはエラーです。

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

Nullポインター例外とは何かを合理的に理解しており、私と同様の問題を徹底的に検索しています。クリックリスナをいくつかの方法で再フォーマットし、正しいビュー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>

どんな助けも大歓迎です。

19
Jack.Ramsden

Submitactivity_main.xmlの一部ではないためnullです

findViewById内でActivityを呼び出すと、アクティビティのレイアウト内でViewが検索されます。

代わりにこれを試してください:

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

別のこと:あなたが使用する

Android:layout_below="@+id/LoginTitle"

しかし、あなたが望むのはおそらく

Android:layout_below="@id/LoginTitle"

@id@+idの違いについては この質問 をご覧ください。

53
2Dee

Android.widget.Button.setOnClickListener(Android.view.View $ OnClickListener) 'nullオブジェクト参照

Submitボタンはlogin_modal内にあるため、ボタンにアクセスするにはloginDialogビューを使用する必要があります。

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

私もコードを置き忘れたときに同様のエラーが発生しました

text=(TextView)findViewById(R.id.text);// this line has to be below setcontentview
setContentView(R.layout.activity_my_otype);
//this is the correct place
text.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            }
    });

以下に示すように、正しい順序でコードを配置する作業をしました

setContentView(R.layout.activity_my_otype);
text=(TextView)findViewById(R.id.text);
 text.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            }
    });
0
Jose Kj

Main.xmlのButtonに次のようなわかりやすい名前を付けてみてください。

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

(少なくとも、最初の文字はXMLファイルで小文字を使用してください)

そして、MainActivityクラスで次のように宣言します:

Button buttonXYZ;

OnCreate(Bundle savedInstanceState)メソッドで、次のように定義します:

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

また、Buttons/TextViewsを外側に移動し、.setOnClickListenerの前に配置します。コードがきれいになります。

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