我有一个相当简单的屏幕,只有4个按钮。我将它像片段一样实现:
public class MainFragment extends Fragment implements View.OnClickListener {
// ...
@Override
public void onClick(View view) {}
}
每个按钮已经为片段附加的活动中的某个功能指定了onClick
。我遇到的问题是,单击按钮时不会调用onClick
个函数。我已经将MainFragment.onClick()
留空了 - 但这是正确的做法吗?是否需要为要调用的函数实现?如果是这样,Button布局中的onClick
属性似乎是多余的。
任何帮助将不胜感激。
由于
答案 0 :(得分:2)
正确的方法是使用片段监听器与活动进行通信:
mYourButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (mListener != null) {
mListener.onFragmentInteraction();
}
}
});
然后在你的片段中:
FacebookFieldRetriever
答案 1 :(得分:1)
如果在XML中设置onClick
,则点击事件将转到您的容器活动中。但是,您可以通过将onClickListener
设置为Fragment的实现来将点击事件直接发送到您的片段。因此,在您的片段onCreateView()
方法中,您会夸大您的布局,然后将Button的onClickListener
设置为您的片段实现,就像这样...
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.your_fragment, container, false);
Button button = (Button) view.findViewById(R.id.your_button);
button.setOnClickListener(this);
return view;
}
通过将setOnClickListener()
设置为this
,您可以将该按钮的所有点击事件发送到您的片段而不是您的活动。然后,您只需处理onClick
事件,就像您已经在做的那样......
@Override
public void onClick(View view) {
Log.d("YOUR BUTTON", "This is called from your Fragment instead of your Activity");
}
答案 2 :(得分:1)
FWIW我从不使用xml
onClick
属性。虽然它们可以节省几行打字,但是它们使得更难以跟踪代码中发生的事情。
如果您的班级implements
View.OnClickListener
并且您已正确覆盖onClick
方法(您看起来像这样),那么您可以安全地删除onClick
个您的layout
文件,而是通过以下方式为您的小部件点击分配方法:
public class MainFragment extends Fragment implements View.OnClickListener {
private Button viewOne, viewTwo, viewThree;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.your_layout, container, false);
viewOne = (Button) rootView.findViewById(R.id.view_one);
viewTwo = //etc...
//"this" refers to the current object. As the object is of a class that implements OnClickListener,
//passing "this" satisfies the View.OnClickListener parameter required for the setOnClickListener() method.
viewOne.setOnClickListener(this);
viewTwo.setOnClickListener(this);
viewThree.setOnClickListener(this);
return rootView;
}
@Override
public void onClick(View view) {
//To identify the correct widget, use the getId() method on the view argument
int id = view.getId();
switch (id) {
case R.id.view_one:
//viewOne clicked
break;
case R.id.view_two:
//And so on...
}
}
}