我有一个片段类,它包含一些字段。
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句柄方法中我需要同时获取活动和片段。我该怎么办?
答案 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());
}