Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在活动中调用的片段内部onClick_Android_Android Fragments - Fatal编程技术网

Android 在活动中调用的片段内部onClick

Android 在活动中调用的片段内部onClick,android,android-fragments,Android,Android Fragments,我现在正在把东西封装成一个片段,遇到了一个谷歌很难解决的问题。 在我的片段中有一些带有onClick属性的按钮,但它们是在活动中调用的,而不是来自android系统的片段-这使得封装有点笨拙。有没有办法让onClick中的反射内容调用片段?我目前看到的唯一解决方案是不在xml中使用onClick并通过代码在片段内设置click listeners。您可以让活动中被调用的侦听器将调用转发到片段中的侦听器。您应该有一个对FragmentActivity内部片段的引用来传递调用。您必须强制转换以调用该

我现在正在把东西封装成一个片段,遇到了一个谷歌很难解决的问题。
在我的片段中有一些带有onClick属性的按钮,但它们是在活动中调用的,而不是来自android系统的片段-这使得封装有点笨拙。有没有办法让onClick中的反射内容调用片段?我目前看到的唯一解决方案是不在xml中使用onClick并通过代码在片段内设置click listeners。

您可以让活动中被调用的侦听器将调用转发到片段中的侦听器。您应该有一个对FragmentActivity内部片段的引用来传递调用。您必须强制转换以调用该方法,或者让您的片段实现您定义的接口。我知道这不是最好的解决办法,但它会奏效的。如果需要,还可以使用按钮的标记指定要调用的方法名。希望这能有所帮助。

我在2011年与一些谷歌用户交谈过——他们认识到了这个问题,也许将来会有解决办法。在那之前-应该在片段中使用.setOnClick。

它对我有效

添加导入:

    import android.view.View.OnClickListener;
Fragment.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;
    }

问题在于,当版面膨胀时,接收按钮点击的仍然是托管活动,而不是单个片段。

我更喜欢使用以下解决方案来处理onClick事件。这也适用于活动和片段

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;
        }
    }
}

然后问题就消失了。

问题:

1.在XML中,onClick属性将调用活动的公共方法

2.未调用片段的公共方法

3.片段可重用性

解决方案:

片段的布局中将其添加到视图中

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;
    }
}
试试这个

 @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;

哈,你是S.O.上第一个这么说的诚实人。其他所有人都试图用荒谬的解释来掩盖这个问题。我不知道这个问题是否有解决方案,但当试图访问复选框时,这就成了问题,因为OnClickListener在那里不起作用。天哪,当谷歌说他们会解决它时,他们会解决它。没有必要每6个月提醒他们一次!是的,已经4年多了:)当你打开你想要处理onClick事件的片段时,试着替换它,而不是仅仅将它添加到活动的顶部。请参阅以获得更深入的讨论。是的。。。不是一个干净或方便的解决方案,试图在跌倒时从下到上。。。