2015-11-06 4 views
0

Я новичок в разработке C# и Android (используя Xamarin). Я пытаюсь создать простой экран входа в систему, который будет проверять ввод пользователя, и если пользовательский ввод совпадает с данными в текстовых файлах, он покажет, что вход успешно, иначе он покажет, что логин завершился неудачно.Сравнение EditText со строкой в ​​C#

Должен отметить, что я борюсь с этим почти целый день. Я думал, что кое-что испортил в кодировании, поэтому я создал простое консольное приложение, скопировал код там, и он работал отлично, поэтому я предполагаю, что моя проблема связана с сравнением строки с пользовательским вводом из EditText.

Приложение работает успешно, но каждый раз, когда я нажимаю кнопку, связанную с методом, который показан ниже, мое приложение падает и выкидывает меня.

Я создал два текстовых файла с именем user.txt и pass.txt. Первая строка в pass.txt - пароль для пользователя в первой строке в user.txt.

Еще раз, я должен упомянуть, что код отлично работает в консольном приложении (я заменил user_input из EditText на простой Console.Readline и Toast.MakeText с Console.Writeline). Пожалуйста, что я делаю неправильно?

public void read_list(object sender, EventArgs e) 
    { 
     k = FindViewById<EditText>(Resource.Id.user); 
     z = FindViewById<EditText>(Resource.Id.pass); 

     string user_input = k.Text.ToString(); 
     string pass_input = z.Text.ToString(); 

     int count = 0; 
     bool valid = false; 
     const string person = "user.txt"; 
     List<string> users = new List<string>(); 

     using (StreamReader username = new StreamReader(person)) 
     { 
      string line; 
      while ((line = username.ReadLine()) != null) 
      { 
       users.Add(line); 
      } 

      foreach (string s in users) 
      { 
       if (Equals(s, user_input)) 
       { 
        valid = true; 
        break; 
       } 
       count++; 
      } 

     } 


     const string key = "pass.txt"; 
     List<string> passwords = new List<string>(); 
     bool pass_valid = false; 

     using (StreamReader password = new StreamReader(key)) 
     { 
      string pass_line; 
      while ((pass_line = password.ReadLine()) != null) 
      { 
       passwords.Add(pass_line); 
      } 

      if (Equals(passwords[count], pass_input)) 
      { 
       pass_valid = true; 
      } 
      else 
      { 
       pass_valid = false; 
      } 

     } 

     if ((pass_valid) && (valid)) 
     { 
      Toast.MakeText(this, "Login successful", ToastLength.Short).Show(); 
     } 
     else 
     { 
      Toast.MakeText(this, "Login failed", ToastLength.Short).Show(); 
     } 


    } 
+0

, пожалуйста, покажите журналы ошибок, если приложение сбой –

+0

@ ρяσѕρєя K: Журналов ошибок нет. Приложение просто падает и говорит: «К сожалению, приложение перестало работать» и выкинул меня. Ни одна ошибка в Visual Studio или что-то еще. – matejcro

+0

Я очень сомневаюсь. Вы можете проверить выходную страницу (View> Output in VS2013) и посмотреть, есть ли там какие-либо исключения? Приложения не просто врезаются, не указывая на то, что есть проблема ... если, конечно, вы не подавили все ошибки. –

ответ

0

Как я уже сказал, ваша основная концепция неверна. Давайте посмотрим, мой пример, проверить это:
MainActivity выглядит

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using System.IO; 

namespace TestStuff 
{ 
    [Activity(Label = "Main",MainLauncher=true,Icon = "@drawable/icon")]    
    public class MainActivity : Activity 
    { 
     //path of folder,where we want to save our .txt File(Downloads) 
     Java.IO.File FolderToSave = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads); 

     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      SetContentView(Resource.Layout.Second); 

      EditText login = FindViewById<EditText>(Resource.Id.editText1); 
      EditText password = FindViewById<EditText>(Resource.Id.editText2); 
      Button btn = FindViewById<Button>(Resource.Id.btn); 
      //here is final Path of our Credentials.txt 
      string filePath = System.IO.Path.Combine(FolderToSave.Path, "Credentials.txt"); 
      //method,that will write correct login/password to .txt file 
      this.WriteFile("Vasya", "12345",filePath); 
      //eventhandler,when we pressing the button,method "check credentials will do some stuff 
      btn.Click += (sender, e) => 
       { 
        //put parametrs: location of Credentials.txt and current login and password 
    CheckForCredentials(filePath,login.Text,password.Text); 
        }; 

     } 
     //create and write credentials.txt with login and pass 
     void WriteFile(string Login,string Password,string Path) 
     { 
      using (StreamWriter Credentials = new StreamWriter (Path)) 
      { 
       //first row will be our login 
       Credentials.WriteLine(Login); 
       //second is password 
       Credentials.WriteLine(Password); 
      } 
     } 

     //check for correct data 
     void CheckForCredentials(string Path,string CurrentLogin,string CurrentPassword) 
     { 
      string Login, Password; 
      if (File.Exists(Path)) 
      { 
       //reading from Credentials.txt first rows(that is our login) 
       Login = File.ReadLines(Path).First(); 
       //same for password 
       Password = File.ReadLines(Path).Last(); 

       //check if introduced values are correct! 
       if (Login == CurrentLogin && Password == CurrentPassword) 
       { 
        Toast.MakeText(this, "Credentials are correct", ToastLength.Short).Show(); 
       } 
       else 
       { 
        Toast.MakeText(this, "Something going wrong", ToastLength.Short).Show(); 
       } 
      } 
      else 
      { 
       //credentials for some reason doest exist in your app. 
       Toast.MakeText(this, "Not exist file", ToastLength.Short).Show(); 
      } 
     } 
    } 
} 

MainLayout.axml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <EditText 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:id="@+id/editText1" 
      android:layout_centerInParent="true" 
      android:layout_marginLeft="60dp" 
      android:hint="UserName" /> 
     <EditText 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/editText1" 
      android:id="@+id/editText2" 
      android:layout_centerInParent="true" 
      android:layout_marginLeft="60dp" 
      android:hint="Password" /> 
     <Button 
      android:text="Check Credentials" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/editText2" 
      android:id="@+id/btn" 
      android:layout_centerInParent="true" 
      android:layout_marginTop="20dp" /> 
    </RelativeLayout> 
</LinearLayout> 

Кроме того, вам нужно поставить разрешения в вашем AndroidManifest.xml (Расположен в папке Профили):

  1. WriteExternalStorage
  2. ReadExternalStorage

И это все :).

Смежные вопросы