2015-05-10 3 views
1

У меня есть класс фрагмента, содержащий некоторое поле.Android - фрагмент дескриптора onClick from activity

public class ReviewFragment extends Fragment { 

    //... 
    private String paramText; 
    public String getParamText() { return paramText; } 
    //... 
} 

Из действия Я добавляю несколько экземпляров этого фрагмента и устанавливаю это значение поля. Также я ставлю каждый экземпляр в список и установить фрагмент тега = «Fragment0», «fragment1» и т.д.

public class ReviewActivity extends FragmentActivity { 

    private List<ReviewFragment> reviewFragments = new ArrayList<>(); 

    //... 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

      //... 

      int i = 0; 
      for (Comment comment : comments) { 
       ReviewFragment reviewFragment = ReviewFragment.newInstance(comment.getAuthor(), comment.getText(), comment.getRate()); 
       reviewFragments.add(reviewFragment); 
       transaction.add(ll.getId(), reviewFragment, "review" + i); 
       i++; 
      } 
    } 

мне нужно обработать щелчок на каждом экземпляре, например ReviewFragment. Поэтому в дизайнере Android Studio я прикладываю следующий метод к onClick корневого макета ReviewFragment.

public void reviewClick(View view) { 
     Intent intent = new Intent(this, FullReviewActivity.class); 
     String fragmentTag = view.getTag().toString(); 
     //... 
     startActivity(intent); 
    } 

Я пытаюсь получить фрагмент тега, чтобы найти фрагмент в моем обзоре списка фрагментов. Проблема заключается в том, что view.getTag() возвращает null, а не «reviewN». Я попытался написать тот же метод в классе ReviewFragment, но Android Studio не разрешил мне прикреплять его к onClick.

Итак, проблема в методе обработки onClick Мне нужно получить как активность, так и фрагмент. Как мне это сделать?

ответ

1

Если вам нужна группа Fragments. Возможно, в этом случае лучше использовать ListView (или любой другой его тип, например RecyclerView). Вы можете легко прослушать событие click и делать все, что хотите, с количеством элементов списка.

Если вам действительно нужно использовать фрагменты. Вы можете следовать по-разному.
Во-первых, в вашем reviewClick(View view) вы получаете тег фрагмента, но смотрите тег. Почему у вас есть View в качестве аргумента?
Вы можете использовать наиболее распространенный подход, если вам нужны фрагменты, используя метод обратного вызова в вашем Activity.
Проблема здесь в том, что ваш Framgent может содержать разные виды, и вы не можете получить onClick непосредственно на весь фрагмент, если вы не используете макет overlay, но в этом случае вам также придется обрабатывать макет onclick.
Возможное решение, как я уже говорил, это использовать метод обратного вызова.

Вот несколько шагов, чтобы осуществить это:

Создать внутренний интерфейс в вашем фрагменте, например

public interface  OnReviewSelectedListener { 
     public void onReviewSelected(int position); } 

Ваш activtiy теперь должны реализовать этот интерфейс

public static class MainActivity extends Activity 
     implements ReviewFragment.OnReviewSelectedListener 

Вы можете определить кадр в

public void onReviewSelected(int position) { 
      if(position==YOUR_TAG) { 

      } 
    } 

И в ReviewFragment в методе onAttach вам нужно придать активности вашему интерфейсу.

@Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      mCallback = (OnReviewSelectedListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnReviewSelectedListener"); 
     } 
    } 

И если вы действительно хотите использовать фрагмент с тегами, вы можете сделать следующее в своем фрагменте.

public void onCommentClick() { 
     // do some stuff 
    mCallback.onReviewSelected(getFramgentTag()); 
} 
+0

В качестве аргумента можно использовать фрагмент? Не знаю, я попробую сейчас. Можете ли вы дать образец кода для второго варианта? –

+0

Было бы лучше, если бы вы могли предоставить полный код своей деятельности и фрагмента. – CROSP

+1

Как я могу сказать, что вы хотите реализовать комментарии/отзывы и щелкнуть что-нибудь с этим комментарием? – CROSP

Смежные вопросы