2017-06-28 3 views
0

Je sais qu'il y a d'autres questions comme celle-ci déjà posées, mais je n'arrive toujours pas à résoudre ce problème.en utilisant des méthodes statiques entre les fichiers java

J'ai deux activités dans le studio android, l'une est homePage.java et l'autre est newMessagePage.java. J'essaie d'utiliser la méthode getPermissiontoReadSMS dans l'activité newMessagePage.java. Puisque c'est dans l'activité homePage.java, je reçois la "méthode non statique ne peut pas être référencée à partir d'une erreur de contexte statique." Certaines suggestions dans d'autres publications incluaient l'ajout d'une instance de la méthode. Je suis encore un peu nouveau à ce sujet et je ne sais pas comment s'y prendre. Toute aide est appréciée.

homePage.java

public class homePage extends AppCompatActivity { 

    private ListView mDrawerList; 
    private DrawerLayout mDrawerLayout; 
    private ArrayAdapter<String> mAdapter; 
    private boolean firstResume = false; 

    ArrayList<String> smsMessagesList = new ArrayList<>(); 
    ListView messages; 
    ArrayAdapter arrayAdapter; 
    private static homePage inst; 

    private static final int READ_SMS_PERMISSIONS_REQUEST = 1; 



    public static homePage instance() { 
     return inst; 
    } 

    public void getPermissionToReadSMS() { 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) 
       != PackageManager.PERMISSION_GRANTED) { 
      if (shouldShowRequestPermissionRationale(
        Manifest.permission.READ_SMS)) { 
       Toast.makeText(this, "Please allow permission", Toast.LENGTH_SHORT).show(); 
      } 
      requestPermissions(new String[]{Manifest.permission.READ_SMS}, READ_SMS_PERMISSIONS_REQUEST); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              @NonNull String permissions[], 
              @NonNull int[] grantResults) { 

     if(requestCode == READ_SMS_PERMISSIONS_REQUEST) { 
      if(grantResults.length == 1 && 
        grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, "Read SMS permission granted", Toast.LENGTH_SHORT).show(); 
       refreshSmsInbox(); 
      }else { 
       Toast.makeText(this, "Read SMS permission denied", Toast.LENGTH_SHORT).show(); 
      } 
     }else { 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 

    public void refreshSmsInbox() { 
     ContentResolver contentResolver = getContentResolver(); 
     Cursor smsInboxCursor = contentResolver.query(Uri.parse("content://sms/inbox"), null, null, null, null); 
     int indexBody = smsInboxCursor.getColumnIndex("body"); 
     int indexAddress = smsInboxCursor.getColumnIndex("address"); 

     if(indexBody < 0 || !smsInboxCursor.moveToFirst()) return; 
     arrayAdapter.clear(); 
     do { 
      String str = "SMS from: " + smsInboxCursor.getString(indexAddress) + 
        "\n" + smsInboxCursor.getString(indexBody) + "\n"; 
      arrayAdapter.add(str); 
     } while(smsInboxCursor.moveToNext()); 

     } 


    private void addDrawerItems() { 
    //side drawer things 
     String[] osArray = { "Sent", "Patients", "Folders", "Trash", "Settings" }; 
     mAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, osArray); 
     mDrawerList.setAdapter(mAdapter); 

     mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       if(position == 4) { 

        Intent settingsIntent = new Intent(homePage.this, settingsPage.class); 
        startActivity(settingsIntent); 
       } 
      } 
     }); 
    } 

    private void FABListener() { 
    //FAB button functions 
     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Intent newMessage = new Intent(homePage.this, newMessagePage.class); 
       startActivity(newMessage); 
      } 
     }); 
    } 

@Override 
protected void onStart() { 
    super.onStart(); 
    inst = this; 
} 

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

     mDrawerList = (ListView)findViewById(R.id.navList); 
     mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 

     messages = (ListView) findViewById(R.id.messages); 
     arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, smsMessagesList); 
     messages.setAdapter(arrayAdapter); 

     if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) { 
      getPermissionToReadSMS(); 
     }else { 
      refreshSmsInbox(); 
     } 

     addDrawerItems(); 
     FABListener(); 
    } 


    @Override 
    protected void onResume() { 
     super.onResume(); 

     if(firstResume) { 
      mDrawerLayout.openDrawer(Gravity.START); 
     } 
     firstResume = false; 
    } 
} 

newMessagePage.java

public class newMessagePage extends AppCompatActivity { 

SmsManager smsManager = SmsManager.getDefault(); 
EditText input; 

public void onSendClick(View view) { 

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) 
      != PackageManager.PERMISSION_GRANTED) { 

     //insert reference to getPermissionToReadSMS method here 


    }else { 

     smsManager.sendTextMessage("07747689961", null, input.getText().toString(), null, null); 
     Toast.makeText(this, "Message sent!", Toast.LENGTH_SHORT).show(); 
    } 
} 

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

    input = (EditText) findViewById(R.id.input); 
} 

}

+0

sur quelle ligne est l'erreur? –

+0

dans le fichier newMessagePage.java. J'ai mis un commentaire où la correction devrait être. –

+0

vous pourriez faire de getpermissiontoreads une fonction statique, mais le code-apprenti dit que c'est mauvais. Je ne suis pas un expert andriod donc je l'écoute –

Répondre

4

Ne faites pas cela! Les méthodes statiques et les variables sont l'exception et non la règle. Dans Android, ils peuvent causer des bogues particulièrement désagréables, surtout avec ce que vous faites ici. Essayer d'accéder aux méthodes d'une activité qui n'est pas actuellement active et affichée à l'écran causera de sérieux problèmes avec votre application. Très probablement, il va planter. Au lieu de méthodes statiques, vous devez en apprendre davantage sur le Activity lifecycle et travailler avec celui-ci afin de ne pas fuir accidentellement la mémoire et d'autres ressources.

Afin de partager la fonctionnalité d'une méthode entre les activités, vous avez au moins trois options:

  1. créer une classe avec la méthode puis déclarer une variable de cette classe à l'intérieur de chaque activité.

  2. Créez une classe abstraite qui étend AppCompatActivity. Ajoutez la méthode à cette classe, puis étendez cette classe pour chacune de vos activités plutôt que d'étendre AppCompatActivity.

  3. Créer une "classe d'utilitaire" avec la méthode et la rendre statique.

La première option est souvent la plus préférée car elle offre le plus de flexibilité. Vous pouvez déclarer autant de variables que vous le souhaitez pour fournir des fonctionnalités différentes.

La deuxième option est correcte, mais elle vous verrouille dans une hiérarchie d'héritage qui peut être très limitative puisque vous ne pouvez étendre qu'une classe.

La troisième option est uniquement pour un dernier recours car les méthodes static ne suivent pas les principes orientés objet.

+0

Oui, d'autres articles similaires à celui-ci ont mentionné cela, mais je ne suis pas sûr de ce que cela signifie ou comment cela se rapportent à des méthodes statiques vs non-statiques. Je suis encore nouveau pour android studio et java. –

+1

Voici un indice, cette méthode n'a pas besoin d'être attachée à votre activité, vous pouvez la généraliser et la mettre dans une classe d'aide ou simplement la dupliquer dans votre autre activité. Toutefois, la méthode Overridden onRequestPermissionsResult doit être dans chaque activité pour laquelle vous demandez des autorisations. –

+0

@HernanRazo J'ai ajouté quelques suggestions pour partager une méthode entre les classes d'activité. –

-2

Essayez ceci:

public static void getPermissionToReadSMS(AppCompatActivity context) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (context.checkSelfPermission(this, Manifest.permission.READ_SMS) 
       != PackageManager.PERMISSION_GRANTED) { 
      if (shouldShowRequestPermissionRationale(
        Manifest.permission.READ_SMS)) { 
       Toast.makeText(this, "Please allow permission", Toast.LENGTH_SHORT).show(); 
      } 
      context.requestPermissions(new String[]{Manifest.permission.READ_SMS}, READ_SMS_PERMISSIONS_REQUEST); 
     } 
    } 
}