【发布时间】:2011-09-27 14:11:03
【问题描述】:
我现在正在将东西封装到一个片段中,并遇到了一个很难用谷歌搜索的问题。 在我的片段内部是一些具有 onClick 属性的按钮,但它们是在 Activity 而不是来自 android 系统的片段上调用的 - 这使得封装有点笨拙。有没有办法让 onClick 的反射内容调用片段?我目前看到的唯一解决方案是不要在 xml 中使用 onClick 并通过代码在片段内设置点击侦听器。
【问题讨论】:
我现在正在将东西封装到一个片段中,并遇到了一个很难用谷歌搜索的问题。 在我的片段内部是一些具有 onClick 属性的按钮,但它们是在 Activity 而不是来自 android 系统的片段上调用的 - 这使得封装有点笨拙。有没有办法让 onClick 的反射内容调用片段?我目前看到的唯一解决方案是不要在 xml 中使用 onClick 并通过代码在片段内设置点击侦听器。
【问题讨论】:
我与一些谷歌员工@#adl2011 进行了交谈 - 他们认识到了这个问题,也许将来会解决这个问题。在那之前 - 应该在 Fragment 中使用 .setOnClick。
【讨论】:
问题在于,当布局膨胀时,接收按钮点击的仍然是托管 Activity,而不是单个 Fragment。
我更喜欢使用以下解决方案来处理 onClick 事件。这也适用于 Activity 和 Fragments。
public class StartFragment extends Fragment implements OnClickListener{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_start, container, false);
Button b = (Button) v.findViewById(R.id.StartButton);
b.setOnClickListener(this);
return v;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.StartButton:
...
break;
}
}
}
那么问题就解决了。
【讨论】:
对我有用
添加导入:
import android.view.View.OnClickListener;
片段.java
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = (ViewGroup) inflater.inflate(R.layout.fragment, container, false);
Button mButton = (Button) rootView.findViewById(R.id.button);
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
}
});
return rootView;
}
【讨论】:
问题:
1.在XML中的onClick属性会调用activity的public方法。
2.Fragment 的公共方法没有被调用。
3.片段可重用性。
解决方案:
在 Fragment 的布局中将其添加到视图中。
android:onClick="onFragmentViewClick"
在每个活动中,片段可能属于..
public void onFragmentViewClick(View v) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.container);
if (fragment != null && fragment.isVisible()) {
if (fragment instanceof SomeFragment) {
((SomeFragment) fragment).onViewClicked(v);
}
}
}
在片段中包含这个方法..
public void onViewClicked(View v) {
switch (v.getId()) {
case R.id.view_id:
Log.e("onViewClicked", "yehhh!!");
break;
}
}
【讨论】:
您可以让活动中被调用的侦听器将调用转发到片段中的侦听器。您应该有对 FragmentActivity 内部片段的引用以传递调用。您必须强制转换以调用该方法或让您的片段实现您定义的接口。我知道这不是最好的解决方案,但它会起作用。如果需要,您还可以使用按钮的标记来指定要调用的方法名称。希望这会有所帮助。
【讨论】:
试试这个...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.activity_ipadditional_users, container, false);
FloatingActionButton button7 = (FloatingActionButton) rootView.findViewById(R.id.fab_ip_additional_user);
button7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getActivity(), IPAdditionalUsersEdit.class);
startActivity(intent);
}
});
return rootView;
【讨论】: