2017-02-03 12 views
2

我試圖將某些方法從我的登錄活動移出到單獨的類,以便它們可以被其他活動重用。我一直無法弄清楚,並希望根據我的用法在下面列舉一些例子。如何將我的AutoCompleteTextView方法/適配器移動到自己的類

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

的'onRequestPermissionsResult'必須是在類,因爲它是回調。不知道你可以提取。 –

回答

0

現實的方法,你可以使用一個CursorAdapter刪除所有的裝載機的東西,但無論如何


首先,我會提取出「可能請求」的方法。

public interface ContactPermissionRequester { 
    boolean mayRequestContacts(); 
} 

有您的活動實施。

然後,這個想法是,你只是想有一個裸骨活動,並自我包含自動完成textview。爲此,至少需要Context和TextView。對於DB Loader,你也可以通過。

您需要在活動中詢問這些方法的權限我認爲

  • checkSelfPermission
  • shouldShowRequestPermissionRationale
  • requestPermissions

你可以嘗試給其他類ContextCompat而不是Context的,看看就可以在許可的邏輯移動。

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(); 

    } 
} 

幾乎所有的東西都可以被拉入新的類,並在必要時使用適當的參數/字段。 Activity現在只是一個Context,但它也實現了可以請求權限的早期接口。

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

您已經擁有該方法。你可以在另一個類上調用填充方法,但這是關於它的,而不需要在其上創建新的方法 –

0

您可以theorecticly extraxt所有公共方法,未overridding各自的超類方法。這將是

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) 

我將參數

LoginActivity log_act 

添加到每個方法,這樣你就可以給方法

this 

指針類實例。 這樣的方法都仍然可以訪問到所有的類,像場

public AutoCompleteTextView inputEmail; 

或類似

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

如何提取方法[這僅僅是一個數組適配器]答案@cricket_007 gave is correct。但對於那些希望實際工作的代碼的人,我在下面列出它,並根據構建版本> = API level 23的要求處理權限請求,蛇行和對話框,我還實施了Google's easypermissions

活動:

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:

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) { 
    } 
} 
相關問題