2015-01-07 4 views
0

Привет, у меня есть приложение при запуске, покажите мне кнопку входа в систему, когда я нажму это, он покажет мне диалог при вводе имени пользователя и пароля, затем нажмите ОК, и он должен сохранить имя пользователя в файле в моем внутреннее хранилище. Но когда я нажимаю ok, мое приложение падает, давая мне ошибку в logcat.Android сохранить файл во внутреннее хранилище

Здесь MainClass:

public class MainActivity extends ActionBarActivity { 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
     } 

     public void loginMethod(View v){ 
      MyDialog dialog = new MyDialog(); 
      dialog.show(getSupportFragmentManager(),"my_dialog"); 
     } 

     public void writeToFile(String data) { 
      try { 
       OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("config.txt", Context.MODE_PRIVATE)); 
       outputStreamWriter.write(data); 
       outputStreamWriter.close(); 
      } 
      catch (IOException e) { 
       Log.e("Exception", "File write failed: " + e.toString()); 
      } 
     } 

    } 


Here DialogClass: 

    public class MyDialog extends DialogFragment{ 

    LayoutInflater inflater; 
    View v; 
    EditText user, password; 

    MainActivity main; 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     inflater = getActivity().getLayoutInflater(); 
     v = inflater.inflate(R.layout.my_dialog_layout,null); 

     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setView(v).setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       user = (EditText) v.findViewById(R.id.username); 
       password = (EditText) v.findViewById(R.id.password); 
       if (user.getText().toString().equals("hello") && password.getText().toString().equals("123")) { //here it checks if username and password are "hello" and "123"; if true it should save into file 

        main.writeToFile(user.getText().toString()); 
        Intent i = new Intent("user_activity"); 
        startActivity(i); 
        Toast.makeText(getActivity(), "Welcome: " + user.getText().toString(), Toast.LENGTH_LONG).show(); 
       } else { 
        Toast.makeText(getActivity(), "Username invalid", Toast.LENGTH_LONG).show(); 
       } 
      } 
     }).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

      } 
     }); 

     return builder.create(); 
    } 
} 

Это LogCat:

01-07 10:53:32.000: E/AndroidRuntime(13341): FATAL EXCEPTION: main 
01-07 10:53:32.000: E/AndroidRuntime(13341): java.lang.NullPointerException 
01-07 10:53:32.000: E/AndroidRuntime(13341): at com.example.digitpassword2.MyDialog$1.onClick(MyDialog.java:44) 
01-07 10:53:32.000: E/AndroidRuntime(13341): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166) 
01-07 10:53:32.000: E/AndroidRuntime(13341): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-07 10:53:32.000: E/AndroidRuntime(13341): at android.os.Looper.loop(Looper.java:137) 
01-07 10:53:32.000: E/AndroidRuntime(13341): at android.app.ActivityThread.main(ActivityThread.java:5103) 
01-07 10:53:32.000: E/AndroidRuntime(13341): at java.lang.reflect.Method.invokeNative(Native Method) 
01-07 10:53:32.000: E/AndroidRuntime(13341): at java.lang.reflect.Method.invoke(Method.java:525) 
01-07 10:53:32.000: E/AndroidRuntime(13341): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
01-07 10:53:32.000: E/AndroidRuntime(13341): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-07 10:53:32.000: E/AndroidRuntime(13341): at dalvik.system.NativeStart.main(Native Method) 

Благодаря

+1

что номер строки '44' в MyDialog.java? –

+0

@ ρяσѕρєяK строка 44 такова: main.writeToFile (user.getText(). ToString()); – xXJohnRamboXx

ответ

2

Здесь:

main.writeToFile(user.getText().toString()); 

NullPointerException потому main экземпляр MainActivity - Null.

если вы хотите вызвать метод из Activity в Fragment затем сделать это так:

((MainActivity)getActivity()).writeToFile(user.getText().toString()); 
+0

Технически правильно, но подход к дизайну OP нарушен. Если он решает реорганизовать/повторно использовать свой фрагмент MyDialog 'Fragment', тогда его можно использовать только с помощью' Activity' под названием MainActivity, который * должен * иметь метод writeToFile (...) '. – Squonk

+0

спасибо, много сейчас работает! Где он сохранит мой файл? Какой путь? – xXJohnRamboXx

+0

См. Документ для [openFileOutput] (http://developer.android.com/reference/android/content/Context.html#openFileOutput%28java.lang.String,%20int%29), но, вероятно, в ' > data-> app_package_name> files' –