2013-04-17 3 views
2

Отредактировано ниже Вынесенная с //// EDIT ////Почему Android не получит мой введенный текст?

New Edit ниже отмечены /// /// newedit

Мой код, который я буду размещать ниже заимствован из нескольких мест и достаточно отличается от любого учебника или примеров, которые я нашел в Интернете, что я не могу понять, что не так.

Я пытаюсь сделать страницу входа для своего приложения. в настоящее время он не извлекает текст, который я вводил в имя пользователя и пароль (здесь именоваться u и p). Если я вхожу в файл strings.xml и жесткий код u и p в приложение, он извлекает их и передает их на JSONParser.java.

У меня проблема с решением этой проблемы. Googledev и другие предлагают использовать

Intent intent = new Intent(this, nextActivity.class); 

Но я не посылая намерения или и- и р к «nextActivity», чтобы проверить логин. Это происходит в той же деятельности «LoginActivity».

Я попытался разместить inputUser = (EditText) findViewById (R.id.loginUser); в других областях, таких как ... public void onClick ... и .... Mytask .... не повезло.

Может кто-нибудь помочь мне сделать код, чтобы получить введенный новый текст, будь то жесткий код в тексте или нет? Наверное, простая проблема, но я в тупике.

Вот весь код

package com.exmple.myapp; 


import gdmeter.myapp_Calc; 
import library.DatabaseHandler; 
import library.UserFunctions; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class LoginActivity extends Activity { 
    Button btnLogin; 
    Button btnLinkToRegister; 
    EditText inputUser; 
    EditText inputPassword; 
    TextView loginErrorMsg; 

// JSON Response node names 
private static String KEY_SUCCESS = "success"; 
private static String KEY_ERROR = "error"; 
private static String KEY_ERROR_MSG = "error_msg"; 
private static String KEY_UID = "uid"; 
private static String KEY_NAME = "name"; 
private static String KEY_EMAIL = "email"; 
private static String KEY_CREATED_AT = "created_at"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.login); 

    inputUser = (EditText) findViewById(R.id.loginUser); 
    inputPassword = (EditText) findViewById(R.id.loginPassword); 
    btnLogin = (Button) findViewById(R.id.btnLogin); 
    btnLinkToRegister = (Button) findViewById(R.id.btnLinkToRegisterScreen); 
    loginErrorMsg = (TextView) findViewById(R.id.login_error); 


    final MyTask myTask = new MyTask(); 
    // Login button Click Event 
    btnLogin.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View view) { 
      // Importing all assets like buttons, text fields 
      myTask.execute() ; 

     } 


      // Link to Register Screen 
      /**  btnLinkToRegister.setOnClickListener(new View.OnClickListener() { 

       public void onClick(View view) { 
        Intent i = new Intent(getApplicationContext(), 
          RegisterActivity.class); 
        startActivity(i); 
        finish(); 
       } 
      }); 
     **/ 
    }); 
}  

//*** Move out MyTask 
class MyTask extends AsyncTask<Void,Void,Void>{ 
    String user = inputUser.getText().toString(); 
    String password = inputPassword.getText().toString(); 
    @Override 
    protected Void doInBackground(Void... params) { 

     UserFunctions userFunction = new UserFunctions(); 
     JSONObject json = userFunction.loginUser(user, password); 
     // check for login response 
     try { 
      if (json.getString(KEY_SUCCESS) != null) { 
       loginErrorMsg.setText(""); 
       String res = json.getString(KEY_SUCCESS); 
       if(Integer.parseInt(res) == 1){ 
        // user successfully logged in 
        // Store user details in SQLite Database 
        DatabaseHandler db = new DatabaseHandler(getApplicationContext()); 
        JSONObject json_user = json.getJSONObject("user"); 

        // Clear all previous data in database 
        userFunction.logoutUser(getApplicationContext()); 
        db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));       

        // Launch Dashboard Screen 
        Intent dashboard = new Intent(getApplicationContext(), myapp_Calc.class); 

        // Close all views before launching Dashboard 
        dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(dashboard); 

        // Close Login Screen 
        finish(); 
       }else{ 
        // Error in login 
        loginErrorMsg.setText("Incorrect username/password"); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      } 

     return null; 
     } 
    } 
} 

//// EDIT //// Вот login.xml. В примере кода был раздел регистрации, который я пока не использую. Поэтому не обращайте внимания на это, если это не по какой-то причине, вызывающей проблему. Я оставлю несколько пробелов, а затем покажу новый код, предложенный @TJ Thind.

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#3b3b3b" > 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:padding="10dip" > 
    <!-- View Title Label --> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="10dip" 
     android:text="LOGIN" 
     android:textSize="25dip" 
     android:textStyle="bold" /> 
    <!-- Email Label --> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Username" /> 
    <!-- Email TextField --> 
    <EditText 
     android:id="@+id/loginUser" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="jj" /> 

    <!-- Password Label --> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="15dip" 
     android:text="Password" /> 
    <!-- Password TextField --> 
    <EditText 
     android:id="@+id/loginPassword" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="jj" 
     android:password="true" /> 

    <!-- Error message --> 
    <TextView android:id="@+id/login_error" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:textColor="#e30000" 
       android:padding="10dip" 
       android:textStyle="bold"/> 

    <!-- Login Button --> 
    <Button 
     android:id="@+id/btnLogin" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="20dip" 
     android:text="Login" /> 

    <!-- Link to Registration Screen --> 
    <Button 
     android:id="@+id/btnLinkToRegisterScreen" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="40dip" 
     android:background="@null" 
     android:text="I don&apos;t have account. Register Me!" 
     android:textColor="#21dbd4" 
     android:textStyle="bold" /> 
</LinearLayout> 

теперь для обновленного кода

package com.exmple.myapp; 


import gdmeter.myapp_Calc; 
import library.DatabaseHandler; 
import library.UserFunctions; 

import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import com.exmple.gdmeter.R; 

public class LoginActivity extends Activity { 
Button btnLogin; 
Button btnLinkToRegister; 
EditText inputUser; 
EditText inputPassword; 
TextView loginErrorMsg; 

// JSON Response node names 
private static String KEY_SUCCESS = "success"; 
private static String KEY_ERROR = "error"; 
private static String KEY_ERROR_MSG = "error_msg"; 
private static String KEY_UID = "uid"; 
private static String KEY_NAME = "name"; 
private static String KEY_EMAIL = "email"; 
private static String KEY_CREATED_AT = "created_at"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.login); 


    final MyTask myTask = new MyTask(); 
    // Login button Click Event 
    btnLogin.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View view) { 
      // Importing all assets like buttons, text fields 
      String user = inputUser.getText().toString(); 
      String password = inputPassword.getText().toString(); 
      myTask.execute(user,password) ; 

     } 


      // Link to Register Screen 
      /**  btnLinkToRegister.setOnClickListener(new View.OnClickListener() { 

       public void onClick(View view) { 
        Intent i = new Intent(getApplicationContext(), 
          RegisterActivity.class); 
        startActivity(i); 
        finish(); 
       } 
      }); 
     **/ 
    }); 
}  

//*** Move out MyTask 
class MyTask extends AsyncTask<String,Void,Void>{ 
    @Override 
    public Void doInBackground(String... params) { 
     String user = params[0]; 
     String password = params[1]; 

     UserFunctions userFunction = new UserFunctions(); 
     JSONObject json = userFunction.loginUser(user, password); 
     // check for login response 
     try { 
      if (json.getString(KEY_SUCCESS) != null) { 
       loginErrorMsg.setText(""); 
       String res = json.getString(KEY_SUCCESS); 
       if(Integer.parseInt(res) == 1){ 
        // user successfully logged in 
        // Store user details in SQLite Database 
        DatabaseHandler db = new DatabaseHandler(getApplicationContext()); 
        JSONObject json_user = json.getJSONObject("user"); 

        // Clear all previous data in database 
        userFunction.logoutUser(getApplicationContext()); 
        db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));       

        // Launch Dashboard Screen 
        Intent dashboard = new Intent(getApplicationContext(), myapp_Calc.class); 

        // Close all views before launching Dashboard 
        dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(dashboard); 

        // Close Login Screen 
        finish(); 
       }else{ 
        // Error in login 
        loginErrorMsg.setText("Incorrect username/password"); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      } 

     return null; 
     } 
    } 
} 

Я был в состоянии реализовать все TJ предложенное за исключением "частной Пустоты doInBackground".

Изменение, которое вызвало ошибки, не позволяющие запускать приложение. Поэтому я оставил его публичным.

С этими новыми изменениями я получаю немедленное сбои приложения. Ошибки включают Fatal Exception: главное ... не в силах начать деятельность по LoginActivity из-за NullPointerException ....

/// /// newedit

04-28 19:20:06.517: D/ActivityThread(10674): setTargetHeapUtilization:0.25 
04-28 19:20:06.517: D/ActivityThread(10674): setTargetHeapIdealFree:8388608 
04-28 19:20:06.517: D/ActivityThread(10674): setTargetHeapConcurrentStart:2097152 
04-28 19:20:06.667: W/dalvikvm(10674): threadid=1: thread exiting with uncaught exception (group=0x40eca438) 
04-28 19:20:06.667: E/AndroidRuntime(10674): FATAL EXCEPTION: main 
04-28 19:20:06.667: E/AndroidRuntime(10674): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.exmple.gdmeter/com.exmple.gdmeter.LoginActivity}: java.lang.NullPointerException 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2088) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.app.ActivityThread.access$700(ActivityThread.java:139) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1224) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.os.Looper.loop(Looper.java:137) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.app.ActivityThread.main(ActivityThread.java:4918) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at java.lang.reflect.Method.invokeNative(Native Method) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at java.lang.reflect.Method.invoke(Method.java:511) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at dalvik.system.NativeStart.main(Native Method) 
04-28 19:20:06.667: E/AndroidRuntime(10674): Caused by: java.lang.NullPointerException 
04-28 19:20:06.667: E/AndroidRuntime(10674): at com.exmple.gdmeter.LoginActivity.onCreate(LoginActivity.java:46) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.app.Activity.performCreate(Activity.java:5048) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
04-28 19:20:06.667: E/AndroidRuntime(10674): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052) 
04-28 19:20:06.667: E/AndroidRuntime(10674): ... 11 more 

Хорошо, есть LogCat. Надеюсь, это поможет. Любая помощь будет приятной. Я благодарю всех за помощь.

+0

Post login.xml. –

+0

'из-за nullpointerexception' Это довольно большой намек. Еще раз посмотрите на свой логарифм, чтобы сузить, в какой строке это исключение. Отправьте свой журнал на свой вопрос. –

+0

Я обновил сообщение с помощью logcat. Мои исследования обнулялись при исключении nullpointer. поместив log.d вокруг, пытаясь найти, где он терпит неудачу, и обнаружил, что это когда он входит в onClickView. есть ли другой способ сделать это и выполнить эту задачу в отдельном потоке? Может быть, я не должен пытаться заставить это работать так, как есть, а скорее по-другому. –

ответ

0

Сохраняются значения пользователя и пароля в задаче при его экземпляре. На данный момент в текстовых полях нет значения. Вы должны передавать эти значения в качестве параметров при выполнении задачи, а не при ее экземпляре, или позволить задаче взять их из своей деятельности, если они видны.

+0

Я ценю вашу помощь. Я уверен, что вы правы в этом аспекте, но моя проблема заключается в том, чтобы заставить код делать то, что вы предлагаете. Я добавляю то, что я считаю правильным кодом для извлечения параметров при выполнении, но получаю ошибки. Пожалуйста, обратитесь к сообщению @TJ Thind. Я добавил изменения кода, которые он предложил, и объяснил полученные результаты. –

0

В вашем методе onCreate вы определяете свои поля ввода и только несколько строк дальше, вы создаете экземпляр MyTask. Но в вашем случае MyTask поля ввода будут считываться мгновенно по созданию:

class MyTask extends AsyncTask<Void,Void,Void>{ 
    String user = inputUser.getText().toString(); // this will be read when you instantiate your MyTask 
    String password = inputPassword.getText().toString(); 


    @Override 
    protected Void doInBackground(Void... params) { // this will be executed when the click listener gets triggered 

Так имя пользователя и поле пароля на самом деле будет читать непосредственно после их создания, без пользователя, будучи в состоянии входа ничего. Поэтому, когда пользователь пишет что-то в полях и нажимает кнопку, строки user и password уже созданы и пусты (потому что там нечего было читать).

Попробуйте прочитать имя пользователя и пароль в методе doInBackground(Void... params) - что должен делать трюк (я надеюсь)

+0

Я ценю вашу помощь. Я уверен, что вы правы в этом аспекте, но моя проблема заключается в том, чтобы заставить код делать то, что вы предлагаете. Я добавил, что я считаю правильным кодом для получения параметров при выполнении, но получаю ошибки. Пожалуйста, обратитесь к сообщению @TJ Thind. Я добавил изменения кода, которые он предложил, и объяснил полученные результаты. Его предложение очень похоже на ваше. Дайте мне знать, если вам нужна дополнительная информация. –

1

Изменить ваше определение класса AsyncTask к этому:

class MyTask extends AsyncTask<String,Void,Void> 

Затем параметры doInBackground в этом :

private Void doInBackground(String... params) 

В doInBackground получить имя пользователя и пароль, как так:

String user = params[0] 
String password = params[1]; 

Наконец изменить кнопку слушателя к этому:

btnLogin.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View view) { 
      // Importing all assets like buttons, text fields 
      String user = inputUser.getText().toString(); 
      String password = inputPassword.getText().toString(); 
      myTask.execute(user,password) ; 

     } 

Теперь для объяснения. Точно так же, как GameDroids и eltabo указали, когда вы создаете объект MyTask, поля пользователя и пароль MyTask будут пустыми, потому что в этот момент, вероятно, нет текста в этих EditTexts.

+0

+1 для решения :) Мне было интересно, не будет ли доступ к полям inputUser и inputPassword непосредственно из метода doInBackground. Почему вы выбрали чтение полей в 'onClick'? – GameDroids

+1

Поскольку он имеет подклассы, это сработает.Однако doInBackGround работает в другом потоке, поэтому я не верю, что доступ к таким полям был бы потокобезопасным. Кроме того, как раз на практике я избегаю прямого доступа к полям классов и передаю их через параметры метода, где это возможно. Никогда не знайте, когда вы захотите, чтобы Un-sub-класс AsyncTask вам не нужно было возвращать и изменять какой-либо код. –

+0

true! таким образом очистив кодирование таким образом! – GameDroids