0

I'm new to android programming, now my application ceashes. The MainAcitivity is used to login, when the "login" button was clicked, it should hava been changed to another activity, but it crashed. Here's my MainAcitivity code:

package com.example.mt;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private EditText accountEdit;
    private EditText passwordEdit;
    private Button login_button;
    private CheckBox rememberPass;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final SharedPreferences settings = getPreferences(MODE_PRIVATE);
        accountEdit = findViewById(R.id.account);
        passwordEdit = findViewById(R.id.password);
        rememberPass = findViewById(R.id.remember_pass);
        login = findViewById(R.id.login);
        boolean isRemember = settings.getBoolean("remember_pass",false);
        if(isRemember){
            String account = settings.getString("account","");
            String password = settings.getString("password","");
            accountEdit.setText(account);
            passwordEdit.setText(password);
            rememberPass.setChecked(true);
        }
        login_button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                String account = accountEdit.getText().toString();
                String password = passwordEdit.getText().toString();
                if (account.equals("tianmiao")&&password.equals("tianmiao")){
                    SharedPreferences.Editor editor = settings.edit();
                    if(rememberPass.isChecked()){
                        editor.putBoolean("remember_password",true);
                        editor.putString("account",account);
                        editor.putString("password",password);
                    } else{
                        editor.clear();
                    }
                    editor.apply();
                    Intent intent = new Intent(MainActivity.this,SearchActivity.class);
                    startActivity(intent);
                    finish();
                }else{
                    Toast.makeText(MainActivity.this,"wrong account or password(both tianmiao)",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

Here's SearchAcitivity code:

package com.example.mt;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class SearchActivity extends AppCompatActivity {
    private EditText searchEditText;
    private Button search_button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        searchEditText = findViewById(R.id.search);
        search_button = findViewById(R.id.search_button);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        search_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              String search = searchEditText.getText().toString();
              if(search.equals("balabala")){
                  Intent intent = new Intent(SearchActivity.this,ListActivity.class);
                  startActivity(intent);
                  finish();
              }else{
                  Toast.makeText(SearchActivity.this,"No"+search+"(there's only balabala)",Toast.LENGTH_SHORT).show();
              }

            }
        });
    }
}

MainAcitivity xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal">
    <TextView
        android:layout_width="90dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:textSize="18sp"
        android:text="account:"/>
    <EditText
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:id="@+id/account"/>

    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="18sp"
            android:text="password:"/>
        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:id="@+id/password"
            android:inputType="textPassword"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/remember_pass"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:text="remember"/>
    </LinearLayout>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:id="@+id/login_button"
        android:text="login"/>
    </LinearLayout>


SearchActivity xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SearchActivity"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="18sp"
            android:text="buy what?:"/>
        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"
            android:id="@+id/search"/>

    </LinearLayout>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:id="@+id/search_button"
        android:text="search"/>

</LinearLayout>

Here's Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mt">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SearchActivity"></activity>
        <activity android:name=".ListActivity" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

red part of logcat:

2019-12-22 19:10:30.600 12135-12135/? E/com.example.mt: Unknown bits set in runtime_flags: 0x8000
2019-12-22 19:10:31.403 12135-12161/com.example.mt E/eglCodecCommon: glUtilsParamSize: unknow param 0x000082da
2019-12-22 19:10:31.404 12135-12161/com.example.mt E/eglCodecCommon: glUtilsParamSize: unknow param 0x000082da
Process: com.example.mt, PID: 12135
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mt/com.example.mt.SearchActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        at com.example.mt.SearchActivity.onCreate(SearchActivity.java:21)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
2019-12-22 19:10:49.884 12135-12135/com.example.mt I/Process: Sending signal. PID: 12135 SIG: 9

Thank you!

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
JungleDeer
  • 11
  • 1

2 Answers2

1

You are connecting views with ids before layout is inflated and that gives you and null pointer exception here:

    searchEditText = findViewById(R.id.search);
    search_button = findViewById(R.id.search_button);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);

You need to move:

    searchEditText = findViewById(R.id.search);
    search_button = findViewById(R.id.search_button);

below: setContentView(R.layout.activity_search); like this:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);

    //now view is inflated you can connect views with ids
    searchEditText = findViewById(R.id.search);
    search_button = findViewById(R.id.search_button);
Yupi
  • 4,402
  • 3
  • 18
  • 37
  • Thank you for your help! Now I find the "remember password" function can't work as well, could you help me please? – JungleDeer Dec 22 '19 at 12:13
1

Your original query has already been answered, as for the problem with remember password, it is not working because the value for getting the remember password is

remember_pass

boolean isRemember = settings.getBoolean("remember_pass",false);

And the value for setting the SharedPreference is

remember_password

editor.putBoolean("remember_password",true);

Make them same and it will work.