Android - 从活动处理片段onClick

时间:2015-05-10 05:49:52

标签: java android android-fragments

我有一个片段类,它包含一些字段。

public class ReviewFragment extends Fragment {

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

从活动中我添加了这个片段的几个实例,并设置了这个字段值。我还将每个实例放在List中并设置fragment tag =“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设计器中,我将以下方法附加到ReviewFragment的根布局的onClick上。

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

我正在尝试使用片段标记在我的reviewFragments列表中找到该片段。问题是view.getTag()返回null,而不是“reviewN”。我试图在ReviewFragment类中编写相同的方法,但Android Studio不允许我将它附加到onClick。

问题是 - 在onClick句柄方法中我需要同时获取活动和片段。我该怎么办?

1 个答案:

答案 0 :(得分:2)

如果你需要一堆Fragments。也许在这种情况下,最好使用ListView(或其他任何类型,例如RecyclerView)。您可以轻松地收听点击事件,并根据列表项目的数量执行任何操作。

如果你真的需要使用Fragments。你可以采取不同的方式 首先在你的reviewClick(View view)中,你得到的不是片段标签,而是查看标签。你为什么要View作为论据? 如果您需要片段使用Activity中的回调方法,则可以按照最常用的方法进行操作 这里的问题是,Framgent可能包含不同的视图,如果您没有使用叠加布局,则无法直接点击整个片段,但在这种情况下,您还必须处理布局onclick事件。
我已经提到的可能的解决方案是使用回调方法。

以下是实现此目的的几个步骤:

在片段中创建内部接口,例如

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

您的活动现在必须实现此界面

public static class MainActivity extends Activity
        implements ReviewFragment.OnReviewSelectedListener

您可以在

中确定framgent
 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());
}