Android: как переместить этот код ContentProvider во внешний класс? - PullRequest
0 голосов
/ 19 марта 2012

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

У меня есть средство выбора контактов, которым я сейчас пользуюсь, и я хочу переместить его в свой класс, чтобы облегчить его повторное использование. Возможно ли это, и если да, то как мне переместить два нижних метода в их собственный класс?

public class mainDashView extends Activity {


    public static final int PICK_CONTACT = 1;


    /**
     * @see android.app.Activity#onCreate(Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dashboard);

    showContactSelector();
    }


    // How do I move the bottom two Methods into an external class?
    private void showContactSelector() {


            Intent contactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(contactIntent, PICK_CONTACT);


    }


    @Override
    protected void onActivityResult(int reqCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(reqCode, resultCode, data);

        switch (reqCode) {
        case (PICK_CONTACT) :
          if (resultCode == Activity.RESULT_OK) {
            Uri contactData = data.getData();
            Cursor c =  managedQuery(contactData, null, null, null, null);
            if (c.moveToFirst()) {
              String name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
              // TODO Whatever you want to do with the selected contact name.
            }
          }
          break;
    }

}
}

1 Ответ

2 голосов
/ 19 марта 2012

примерно так:

public class mainDashView extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dashboard);
        Something.showContactSelector(this);
    }

    @Override
    protected void onActivityResult(int reqCode, int resultCode, Intent data) {
        super.onActivityResult(reqCode, resultCode, data);
        Something.onActivityResult(this, reqCode, resultCode, data);
    }
}

class Something {
    private static final int PICK_CONTACT = 1;

    public static void showContactSelector(Activity activity) {
        Intent contactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
        activity.startActivityForResult(contactIntent, PICK_CONTACT);
    }

    public static void onActivityResult(Activity activity, int reqCode, int resultCode, Intent data) {
        switch (reqCode) {
            case (PICK_CONTACT):
                if (resultCode == Activity.RESULT_OK) {
                    Uri contactData = data.getData();
                    Cursor c = activity.managedQuery(contactData, null, null, null, null);
                    if (c.moveToFirst()) {
                        String name = c.getString(c
                                .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                        // TODO Whatever you want to do with the selected
                        // contact name.
                    }
                }
                break;
        }
    }
}

Вам нужно передать вызывающее действие, чтобы некоторые методы работали.Например, в вашем классе Activity вы можете напрямую позвонить startActivityForResult(contactIntent, PICK_CONTACT);, но это только сокращенная версия this.startActivityForResult(contactIntent, PICK_CONTACT);.В другом классе вам нужно заменить невидимое this ссылкой на класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...