2017-05-06 2 views
0

Je veux commencer en disant que je suis un grand débutant, je travaille seulement sur ce sujet depuis environ 4 jours et qui comprend la lecture de nombreuses pages d'un livre de référence java.Android en ignorant les lignes de code dans le programme

Le but de cette application est de prendre des informations à partir d'un fichier texte, puis faire très peu de mathématiques avec elle et ensuite retourner une valeur. Je l'ai eu pour travailler sur l'émulateur sur mon ordinateur fonctionnant sous Android 5.1.1 mais quand je l'ai exécuté sur ma note 4 en cours d'exécution 6.0.1, il saute simplement des lignes de code en mode débogage et je ne comprends pas pourquoi.

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

    TextView output; 

    EditText food; 
    EditText block; 
    EditText ounce; 

    Button calculate_blocks; 
    Button calculate_ounces; 

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



     //finding elements 
     output = (TextView) findViewById(R.id.output); 

     food = (EditText) findViewById(R.id.food); 
     block = (EditText) findViewById(R.id.blocks); 
     ounce = (EditText) findViewById(R.id.ounces); 

     calculate_ounces = (Button) findViewById(R.id.calculate_ounces); 
     calculate_blocks = (Button) findViewById(R.id.calculate_blocks); 


     //setting listeners 
     calculate_blocks.setOnClickListener(this); 
     calculate_ounces.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 


     final String FILENAME = android.os.Environment.getExternalStorageDirectory().getPath() + "/Foods.txt"; 

     BufferedReader fin = null; 
     FileReader fr = null; 

     String currentLine="zeutn", line=null ; 
     String strfood = food.getText().toString(); 
     double gramsOfNutrientPerOunce=0; 
     double ounces=0,blocks=0; 

     try { 
      ounces = Double.parseDouble(ounce.getText().toString()); 
     } catch(NumberFormatException nfe){ 
      ounces=0; 
     } 

     try { 
      blocks = Double.parseDouble(block.getText().toString()); 
     } catch(NumberFormatException nfe){ 
      blocks=0; 
     } 


     //Find refrence value after food in file 

     try { 
      File file1 = new File(FILENAME); 
      file1.createNewFile(); 
      fr = new FileReader(FILENAME); 
      fin = new BufferedReader(fr); 

      while ((currentLine = fin.readLine()) != null) { 
       if ((currentLine.toUpperCase()).equals(strfood.toUpperCase())) { 
        line = fin.readLine(); 
        fr.close(); 
        fin.close(); 
       } else 
        output.setText("Add food to file"); 
      } 

     } catch (IOException e) { 
      output.setText("Fail"); 
      } 


     try{ 
      gramsOfNutrientPerOunce=Double.parseDouble(line); 
     } catch(NumberFormatException nfe){ 
      output.setText("Add food to file"); 
     } 

     String out; 
     double tmp; 
     switch (v.getId()) { 
      case R.id.calculate_blocks: 
       tmp = ounces/gramsOfNutrientPerOunce; 
       out=Double.toString(tmp); 

       output.setText(out); 
       break; 

      case R.id.calculate_ounces: 
       tmp = blocks*gramsOfNutrientPerOunce; 
       out=Double.toString(tmp); 

       output.setText(out); 
       break; 
     } 
    } 
} 

Toute aide est appréciée désolé si je fais tout cela mal aussi si vous avez besoin de plus amples informations ou quoi que ce soit, je serai heureux de fournir it.Thank vous beaucoup à l'avance !!

+0

de publier le journal des erreurs. Que voulez-vous dire sauter des lignes? – Kaushal28

Répondre

1

Je ne sais pas quelles lignes sautent, mais il semble que les autorisations de lecture/écriture soient manquantes.

Vous devez vérifier vos autorisations d'exécution avec Android 6.0 et supérieur.

Documentation For Runtime Permissions.

2

Vous devez disposer d'autorisations d'exécution pour le niveau 23 (Android Api 6.0) et au-dessus. La façon dont vous pouvez faire cela est assez simple.

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
      Manifest.permission.READ_EXTERNAL_STORAGE) 
    != PackageManager.PERMISSION_GRANTED) { 

    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
     Manifest.permission.READ_EXTERNAL_STORAGE)) { 

     // Show an explanation to the user *asynchronously* -- don't block 
     // this thread waiting for the user's response! After the user 
     // sees the explanation, try again to request the permission. 

    } else { 

     // No explanation needed, we can request the permission. 

     ActivityCompat.requestPermissions(thisActivity, 
      new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
      MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); 

     // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 
} 

Alors quelle réponse jamais l'utilisateur que vous pouvez le manipuler donne dans la méthode de rappel, qui va quelque chose comme ça.

@Override 
public void onRequestPermissionsResult(int requestCode, 
     String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // contacts-related task you need to do. 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

Note: échantillon de codage est tiré de https://developer.android.com

Et une autre chose que je remarque est que vous avez setOnClickListeners à vos boutons, mais dans votre méthode onClick vous n'êtes pas manipuler de manière à la fois les boutons lorsque cliqué va effectuer exactement la même chose. vous pouvez les manipuler simplement en basculant view.getID ou dans votre cas v.getID, le code va quelque chose comme ça.

switch (v.getId()){ 

    case R.id.(id_of_firstButton): 
     //do what you have to do for first button 
     break; 
    case R.id.(id_of_secondButton): 
     //do what you have to do for second button 
     break; 
    default: 
     //do something in the default case 
     break; 
}