2017-02-03 7 views
2

ログインアクティビティからいくつかのメソッドを別のクラスに移動しようとしているため、他のアクティビティで再利用できるようになりました。私はそれを理解することができず、以下の私の使用法に基づいたいくつかの例が欲しい。MyCompleteTextViewメソッド/アダプタを自分のクラスに移動する方法

Thnxです。

LoginActivity.java:

public class LoginActivity extends FirebaseUserNet implements LoaderManager.LoaderCallbacks<Cursor> { 


    public AutoCompleteTextView inputEmail; 

    /** 
    * Id to identity READ_CONTACTS permission request. 
    */ 
    public static final int REQUEST_READ_CONTACTS = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

    inputEmail = (AutoCompleteTextView) findViewById(R.id.email); 

    // Populate the users contacts with their given permission 
     populateAutoComplete(); 

    } 

    /** 
     * TODO: Everything below here needs to be put into a separate class(s) for reuse: 
     */ 

    public void populateAutoComplete() { 
     if (!mayRequestContacts()) { 
      return; 
     } 

     getSupportLoaderManager().initLoader(0, null, this); 
    } 

    public boolean mayRequestContacts() { 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
      return true; 
     } 
     if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { 
      return true; 
     } 
     if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { 
      Snackbar.make(inputEmail, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) 
        .setAction(android.R.string.ok, new View.OnClickListener() { 
         @Override 
         @TargetApi(Build.VERSION_CODES.M) 
         public void onClick(View v) { 
          requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); 
         } 
        }); 
     } else { 
      requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); 
     } 
     return false; 
    } 

    /** 
    * Callback received when a permissions request has been completed. 
    */ 
    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
              @NonNull int[] grantResults) { 
     if (requestCode == REQUEST_READ_CONTACTS) { 
      if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       populateAutoComplete(); 
      } 
     } 
    } 

    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
     return new CursorLoader(this, 
       // Retrieve data rows for the device user's 'profile' contact. 
       ContactsContract.Data.CONTENT_URI, ProfileQueryInterface.PROJECTION, 

       // Select only email addresses. 
       ContactsContract.Contacts.Data.MIMETYPE + 
         " = ?", new String[]{ContactsContract.CommonDataKinds.Email 
       .CONTENT_ITEM_TYPE}, 

       // Show primary email addresses first. Note that there won't be 
       // a primary email address if the user hasn't specified one. 
       ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); 
    } 

    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
     List<String> emails = new ArrayList<>(); 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      emails.add(cursor.getString(ProfileQueryInterface.ADDRESS)); 
      cursor.moveToNext(); 
     } 

     addEmailsToAutoComplete(emails); 
    } 

    public void onLoaderReset(Loader<Cursor> cursorLoader) { 

    } 

    private void addEmailsToAutoComplete(List<String> emailAddressCollection) { 
     //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. 
     ArrayAdapter<String> adapter = 
       new ArrayAdapter<>(LoginActivity.this, 
         android.R.layout.simple_dropdown_item_1line, emailAddressCollection); 

     inputEmail.setAdapter(adapter); 
    } 
+0

public class SomeActivity implements EasyPermissions.PermissionCallbacks { . . . /** * Id to identity READ_CONTACTS permission request. */ public static int REQUEST_READ_CONTACTS = 0; @Override protected void onCreate(Bundle savedInstanceState) { . . . //TODO: Fire 'mayRequestContacts()' when the 'AutoCompleteTextView' has focus. mayRequestContacts(); . . . } public void mayRequestContacts() { String[] perms = { Manifest.permission.READ_CONTACTS }; if (EasyPermissions.hasPermissions(this, perms)) { // Have permission, do the thing! } else { // Ask for permissions EasyPermissions.requestPermissions(this, getString(R.string.agreement_positive_text), REQUEST_READ_CONTACTS, perms); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // Forward results to EasyPermissions EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsGranted(int requestCode, List<String> perms) { if (requestCode == REQUEST_READ_CONTACTS) { AutoCompleteTextViewLoader autoCompleteTextViewLoader = new AutoCompleteTextViewLoader(this, inputEmail, getSupportLoaderManager()); autoCompleteTextViewLoader.populate(); } } @Override public void onPermissionsDenied(int requestCode, List<String> perms) { if (requestCode == REQUEST_READ_CONTACTS) { Toast.makeText(this, "Sorry you choose that - You\'ll be typing a lot more.", Toast.LENGTH_SHORT).show(); } } } 

AutoCompleteTextEmailLoader。あなたがそれを抽出できるかどうかは確かではありませ –

答えて

0

ような方法のように、クラス内のすべてにアクセスしますが、とにかく


まず、「may request」メソッドを抽出します。

public interface ContactPermissionRequester { 
    boolean mayRequestContacts(); 
} 

アクティビティを実装しましたか。

次に、ベアボーンの活動を持ち、オートコンプリートのテキストビューを自己完結させたいという考えがあります。そのためには、最低でもContextとTextViewが必要です。 DB Loaderについても、それを渡します。

私はだと思います。

  • checkSelfPermission
  • shouldShowRequestPermissionRationale
  • requestPermissions

あなたはContextするのではなく、他のクラスContextCompatを与えて試してみて、あなたが許可ロジックの周りに移動することができるかどうかを確認できます。

public class LoginActivity extends FirebaseUserNet implements ContactPermissionRequester { 

    @Override 
    public boolean mayRequestContacts() { 
     ... 
    } 

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

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     inputEmail = (AutoCompleteTextView) findViewById(R.id.email); 
     AutoCompleteTextViewLoader autoloader = new AutoCompleteTextViewLoader(this, 
      inputEmail, getSupportLoaderManager()); 
     autoloader.populate(); 

    } 
} 

他のほとんどすべてを新しいクラスにプルすることができ、必要に応じて適切なパラメータ/フィールドを使用できます。アクティビティは単なるコンテキストですが、アクセス権を要求できる以前のインターフェイスも実装しています。

public class AutoCompleteTextViewLoader implements LoaderManager.LoaderCallbacks<Cursor> { 

    private final Context mContext; 
    private final AutoCompleteTextView inputEmail; 
    private final ArrayAdapter<String> adapter; 
    private final LoaderManager loaderManager 

    private final List<String> emails = new ArrayList<>(); 

    private final ContactPermissionRequester requester; 

    public AutoCompleteLoader(Context context, AutoCompleteTextView textView, LoaderManager loaderManager) { 
     this.mContext = context; 

     this.inputEmail = textView; 
     this.adapter = new ArrayAdapter<>(mContext, 
        android.R.layout.simple_dropdown_item_1line,  
        emails); 
     this.inputEmail.setAdapter(adapter); 

     // This can throw a ClassCastException 
     this.mRequester = (ContactPermissionRequester) context; 

     this.loaderManager = loaderManager; 
    } 

    public List<String> getEmails() { return emails; } 

    public void populate() { 
     if (requester != null && !requester.mayRequestContacts()) { 
      return; 
     } 

     loadManager.initLoader(0, null, this); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
     return new CursorLoader(mContext, 
       // Retrieve data rows for the device user's 'profile' contact. 
       ContactsContract.Data.CONTENT_URI, ProfileQueryInterface.PROJECTION, 

       // Select only email addresses. 
       ContactsContract.Contacts.Data.MIMETYPE + 
         " = ?", new String[]{ContactsContract.CommonDataKinds.Email 
       .CONTENT_ITEM_TYPE}, 

       // Show primary email addresses first. Note that there won't be 
       // a primary email address if the user hasn't specified one. 
       ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
     // ArrayList not needed here 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      // Add directly to adapter 
      adapter.add(cursor.getString(ProfileQueryInterface.ADDRESS)); 
      cursor.moveToNext(); 
     } 
     // Separate method was pointless 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> cursorLoader) { 

    } 
} 
+0

Thnx。これまでのところ、これは良く見えています。しかし、私は 'onRequestPermissionsResult'に何を入れるのか分からない... if(requestCode == REQUEST_READ_CONTACTS){ if(grantResults.length == 1 && grantResults [0] == PackageManager.PERMISSION_GRANTED){ // ??????? } } '' ' – CelticParser

+0

あなたはすでにその方法を持っています。他のクラスのpopulateメソッドを呼び出すことはできますが、それについては新しいメソッドを作成することなく –

0

することはできtheorecticly extraxtそれぞれのスーパークラスのメソッドをオーバーライドするされていないすべてのパブリックメソッド、。それはあなたがメソッドにクラスインスタンスへ

this 

ポインタを与えることができますので、私は、すべてのメソッドにパラメータ

LoginActivity log_act 

を追加します

public void populateAutoComplete() 

public boolean mayRequestContacts() 

public Loader<Cursor> onCreateLoader(int i, Bundle bundle) 

public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) 

public void onLoaderReset(Loader<Cursor> cursorLoader) 

private void addEmailsToAutoComplete(List<String> emailAddressCollection) 

だろう。方法はまだ持っている この方法は、あなたがすべてのローダのものを削除するためにCursorAdapterを使用することができ、フィールド

public AutoCompleteTextView inputEmail; 

または現実的

getSupportLoaderManager().initLoader(0, null, this); 
0

[0120]を抽出する方法については、@cricket_007 gave is correct [単なるアレイアダプター]です。しかし実際のコードを望む人は、以下のようにして、ビルドバージョン> = API level 23に必要なアクセス許可リクエスト、snakebar、およびダイアログを処理し、私もGoogle's easypermissionsを実装しました。活動に

:それはコールバックですので、 `onRequestPermissionsResult`は、そのクラスにしておく必要があり

public class AutoCompleteTextEmailLoader implements LoaderManager.LoaderCallbacks<Cursor> { 

    private final Context mContext; 
    private final AutoCompleteTextView inputEmail; 
    private final ArrayAdapter<String> adapter; 
    private final LoaderManager loaderManager; 
    private final List<String> emails = new ArrayList<>(); 

    public AutoCompleteTextEmailLoader(Context context, AutoCompleteTextView textView, LoaderManager loaderManager) { 
     this.mContext = context; 

     this.inputEmail = textView; 
     this.adapter = new ArrayAdapter<>(mContext, 
       android.R.layout.simple_dropdown_item_1line, 
       emails); 
     this.inputEmail.setAdapter(adapter); 
     this.loaderManager = loaderManager; 
    } 

    public void populate() { 
     loaderManager.initLoader(0, null, this); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 
     return new CursorLoader(mContext, 
       // Retrieve data rows for the device user's 'profile' contact. 
       ContactsContract.Data.CONTENT_URI, ProfileQueryInterface.PROJECTION, 

       // Select only email addresses. 
       ContactsContract.Contacts.Data.MIMETYPE + 
         " = ?", new String[]{ContactsContract.CommonDataKinds.Email 
       .CONTENT_ITEM_TYPE}, 

       // Show primary email addresses first. Note that there won't be 
       // a primary email address if the user hasn't specified one. 
       ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
     // ArrayList not needed here 
     cursor.moveToFirst(); 
     while (!cursor.isAfterLast()) { 
      // Add directly to adapter 
      adapter.add(cursor.getString(ProfileQueryInterface.ADDRESS)); 
      cursor.moveToNext(); 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> cursorLoader) { 
    } 
} 
関連する問題