从登录到MainActivity的Android RuntimeException和NullPointerExcepti



我是Android编程的新手,正在尝试创建登录名。似乎登录成功了,但之后应用程序立即崩溃。我认为它崩溃是因为意图,但我对此并不完全确定。这是代码:

错误:

04-13 12:36:58.700    2688-2706/challengeapp.chapp D/Login Successful!﹕ {"message":"Login successful!","success":1}
04-13 12:36:59.316    2688-2688/challengeapp.chapp D/AndroidRuntime﹕ Shutting down VM
04-13 12:36:59.316    2688-2688/challengeapp.chapp W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa4c9eb20)
04-13 12:36:59.336    2688-2688/challengeapp.chapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: challengeapp.chapp, PID: 2688
java.lang.RuntimeException: Unable to start activity ComponentInfo{challengeapp.chapp/challengeapp.chapp.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at challengeapp.chapp.MainActivity.onCreate(MainActivity.java:36)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
04-13 12:37:06.972    2688-2688/challengeapp.chapp I/Process﹕ Sending signal. PID: 2688 SIG: 9

登录.java:

public class  Login extends Activity implements OnClickListener{
private EditText user, pass;
private Button mSubmit, mRegister;
// Progress Dialog
private ProgressDialog pDialog;
// JSON parser class
JSONparser jsonParser = new JSONparser();
//php login script location:
//localhost :
//testing on your device
//put your local ip instead,  on windows, run CMD > ipconfig
//or in mac's terminal type ifconfig and look for the ip under en0 or en1
// private static final String LOGIN_URL = "http://xxx.xxx.x.x:1234/webservice/login.php";
//testing on Emulator:
private static final String LOGIN_URL = "http://chapp.r4u.nl/chappservice/login.php";
//testing from a real server:
//private static final String LOGIN_URL = "http://www.yourdomain.com/webservice/login.php";
//JSON element ids from repsonse of php script:
private static final String TAG_SUCCESS = "success";
private static final String TAG_MESSAGE = "message";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
//setup input fields
user = (EditText)findViewById(R.id.username);
pass = (EditText)findViewById(R.id.password);
//setup buttons
mSubmit = (Button)findViewById(R.id.login);
mRegister = (Button)findViewById(R.id.login);
//register listeners
mSubmit.setOnClickListener(this);
mRegister.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.login:
new AttemptLogin().execute();
break;

default:
break;
}
}
class AttemptLogin extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
boolean failure = false;
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Login.this);
pDialog.setMessage("Attempting login...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
@Override
protected String doInBackground(String... args) {
// TODO Auto-generated method stub
// Check for success tag
int success;
String username = user.getText().toString();
String password = pass.getText().toString();
try {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));
Log.d("request!", "starting");
// getting product details by making HTTP request
JSONObject json = jsonParser.makeHttpRequest(
LOGIN_URL, "POST", params);
// check your log for json response
Log.d("Login attempt", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
Log.d("Login Successful!", json.toString());
Intent i = new Intent(Login.this, MainActivity.class);
finish();
startActivity(i);
return json.getString(TAG_MESSAGE);
} else {
Log.d("Login Failure!", json.getString(TAG_MESSAGE));
return json.getString(TAG_MESSAGE);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* After completing background task Dismiss the progress dialog
*/
protected void onPostExecute(String file_url) {
// dismiss the dialog once product deleted
pDialog.dismiss();
if (file_url != null){
Toast.makeText(Login.this, file_url, Toast.LENGTH_LONG).show();
}
}
}
}

MainActivity.java:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {
private ViewPager viewPager;
private TabPagerAdapter mAdapter;
private ActionBar actionBar;
//Tab titles
private String[] tabs = { "Overzicht", "Onbeoordeeld", "Beoordeeld" };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initilization for the tabs
viewPager = (ViewPager) findViewById(R.id.pager);
actionBar = getActionBar();
mAdapter = new TabPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(mAdapter);
actionBar.setHomeButtonEnabled(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//Adding the tabs
for (String tab_name : tabs)
{
actionBar.addTab(actionBar.newTab().setText(tab_name).setTabListener(this));
}
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// on changing the page
// make respected tab selected
actionBar.setSelectedNavigationItem(position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});

}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// This handles the presses on the action bar items
switch (item.getItemId()) {
case R.id.action_settings:
openSettings();
return true;
case R.id.action_logout:
openLogout();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
//shows what happens if the menu items are pressed
private void openSettings() {
//show the settings
Toast.makeText( this, "Settings work", Toast.LENGTH_SHORT ).show();
}
private void openLogout() {
//let user log out from app
Toast.makeText( this, "Logout button works", Toast.LENGTH_SHORT ).show();
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
// on tab selected
// show respected fragment view
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
}

AndroidManifest.xml的一部分:

<activity
android:name=".Login" >
<intent-filter>
<action android:name="android.intent.action.OTHER" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:label=""
android:theme="@style/Theme.AppCompat" >
<intent-filter>
<action android:name="android.intent.action.OTHER" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

在API 21中,不赞成使用以下使用制表符的方法。你需要使用sidingTabs而不是这个:

actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);`// this is deprecated.

检查以下链接以了解滑动选项卡的实现:

https://www.youtube.com/watch?v=Fl0xMuo10yA&list=PLonJJ3BVjZW6CtAMbJz1XD8ELUs1KXaTD&索引=26

希望这能有所帮助。

从清单中的行来看,您似乎正在使用AppCompat:

<activity
android:name=".MainActivity"
android:label=""
android:theme="@style/Theme.AppCompat" .../>

您应该扩展ActionBarActivity,并使用getSupportActionBar()而不是带有FragmentActivity的getActionBar。

最新更新