Получение значения onclick из библиотеки Android через фрагмент страницы

В настоящее время у меня есть Project A (как Android-библиотека) и Project B.

В Project B я использую фрагмент страницы для дизайна. На фрагменте страницы 1 этот фрагмент фактически вызывается из проекта A (библиотеки).

Как мне получить значение onclick от проекта A до проекта B.

// Объявление фрагмента страницы в проекте Б

CustFragment fragment1 = new CustFragment ();

// прослушиватель onclick в проекте A

mContactList.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Cursor cursor = (Cursor) parent.getAdapter().getItem(position);

            long rawId = cursor.getLong(cursor
                    .getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));

// how do i pass the value to B?

        }

EDITED: я отредактировал этот пост, добавив больше кода со своей стороны

// Объявление фрагмента в проекте B

public class MainPagerFragmentAdapter extends FragmentPagerAdapter {

ListFragment list;
SearchFragment search;  
public MainPagerFragmentAdapter(FragmentManager fragmentManager) {
    super(fragmentManager);
}

@Override
public int getCount() {
    return 2;
}

public String getPageTitle(int position) {
    switch (position) {
        case 0: return AppSingleton.getCurrentActivity().getString(R.string.pager_appointments_tab);
        case 1: return  AppSingleton.getCurrentActivity().getString(R.string.explist_filter_text);
    }
}

@Override
public Fragment getItem(int position) {

    switch (position) {             
        case 0:
            if (customerList == null)
                list = new ListFragment();
            return customerList;
        case 1:
            if (contactSearch == null)
                search = new SearchFragment();
            return contactSearch;
    }

    return null;
}

}

// прослушиватель onclick в проекте A (проект библиотеки)

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    super.onCreateView(inflater, container, savedInstanceState);
    log.info("ContactsFragment onCreateView");
    mContactFragmentView = inflater.inflate(R.layout.fragment_contacts,
            container, false);

    mContactList = (ListView) mContactFragmentView
            .findViewById(R.id.contacts_list);

    mContactList.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            Cursor cursor = (Cursor) parent.getAdapter().getItem(position);

            long rawId = cursor.getLong(cursor
                    .getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));

            // what have to done here to pass back to B dynamically

        }

    });
    getLoaderManager().initLoader(0, null, this);
    return mContactFragmentView;
}
  • java.lang.NullPointerException в com.contact.library.ContactsFragment $ 2.onItemClick (ContactsFragment.java:143) в android.widget.AdapterView.performItemClick (AdapterView.java:308) в android.widget.AbsListView.performItemClick (AbsListView. : 1509) на android.widget.AbsListView $ PerformClick.run (AbsListView.java:3467) на android.widget.AbsListView $ 3.run (AbsListView.java:4830) на android.os.Handler.handleCallback (Handler.java:733 ) в android.os.Handler.dispatchMessage (Handler.java:95) в android.os.Looper.loop (Looper.java:146) в android.app.ActivityThread.main (ActivityThread.java:5602) в java.lang .reflect.Method.invokeNative (собственный метод) в java.lang.reflect.Method.invoke (Method.java:515) в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1283) в com .android.internal.os.ZygoteInit.main (ZygoteInit.java:1099) в dalvik.system.NativeStart.main (собственный метод)

person Then    schedule 15.08.2014    source источник


Ответы (2)


Вы хотите настроить обратный вызов, запускаемый на фрагменте A. Аналогично этому:

создайте интерфейс в своей библиотеке:

public interface MyInterface {
  public void onRawIdAcquired(long rawId);
}

Создайте его экземпляр где-нибудь в вашем FragmentA (и создайте сеттер, который может устанавливать его значение):

public class FragmentA extends Fragment {
...
MyInterface i;
...
public void setListener(MyInterface i) {
  this.i = i;
}

затем вызовите его, когда rowId получит значение:

long rawId = cursor.getLong(cursor.getColumnIndex(ContactsContract.Data.RAW_CONTACT_ID));
i.onRawIdAcquired(rawId);

Теперь в вашем PageFragment в вашей небиблиотечной активности реализуйте MyInterface и переопределите onRawIdAcquired:

public PageFragment extends Fragment implements MyInterface {
@Override
public void onRawIdAcquired(long rawId) {
  **// you can now use the value of rawId here.**
}

Наконец, где-нибудь при создании экземпляра FragmentA передайте PageFragment в setListener:

FragmentA f = ...;
PageFragment myPageFragment = ...;
f.setListener(myPageFragment);
person josephus    schedule 15.08.2014
comment
Проект A - это библиотека, я хочу сделать его динамическим, чтобы любой другой проект мог при щелчке по элементу вернуться обратно в проект B без большой модификации кода. - person Then; 15.08.2014
comment
может я не понял твой вопрос. вы хотите получить объект OnClickListener или просто значение rawID? - person josephus; 15.08.2014
comment
Моя идея состоит в том, чтобы передать значение rawID из проекта A в проект B - person Then; 15.08.2014
comment
Ах. тогда вам нужен какой-то обратный вызов. Я обновлю свой ответ. - person josephus; 15.08.2014
comment
спасибо за предложение, но когда я реализую MyInterface в небиблиотечном проекте, это дает мне ошибку - person Then; 15.08.2014
comment
IDE попросит меня создать MyInterface в небиблиотечном проекте - person Then; 15.08.2014
comment
кроме этого, когда я нажимаю на элемент списка, он генерирует ошибку NullPointerException при вызове метода интерфейса - person Then; 15.08.2014
comment
это странно. можешь выложить точную ошибку, может скриншот? - person josephus; 15.08.2014
comment
привет, я обновил свой вопрос дополнительным кодом и ошибкой. Может ли одна из причин, что я каким-то образом пропускаю последнюю часть вашего кода, потому что я не уверен, какая часть должна ее реализовать - person Then; 15.08.2014
comment
прямо сейчас я могу реализовать MyInterface на PagerAdapater, но при выполнении i.onRawIdAcquired (rawId); это дает ошибку - person Then; 15.08.2014

В проекте библиотеки создайте глобальную переменную, которая будет вызывать переменную из фрагмента. Если вы хотите легкий путь, попробуйте этот. Просто моя идея. Надеюсь на помощь. Основной проект Android с проектом библиотеки - как передавать настройки между проектами

person B M    schedule 15.08.2014
comment
привет, я пытаюсь использовать интерфейс для решения проблемы, но это дает мне исключение nullpointerexception, когда я вызываю метод интерфейса - person Then; 20.08.2014
comment
Это глобальная переменная, использующая образец. stackoverflow.com/a/708317/3247356 ИЛИ stackoverflow.com/a/1945297/3247356 - person B M; 20.08.2014