0

我是 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>
4

2 回答 2

0

在 API 21 中,不推荐使用以下使用选项卡的方法。您需要使用 sidingTabs 而不是这个:

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

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

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

希望这可以帮助。

于 2015-04-13T17:19:00.093 回答
0

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

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

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

于 2015-04-13T17:37:50.077 回答