onClick内部片段调用Activity

时间:2011-09-27 14:11:03

标签: android android-fragments

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

6 个答案:

答案 0 :(得分:59)

我与一些googlers @#adl2011进行了交谈 - 他们认识到了这个问题,将来可能还会解决这个问题。在此之前 - 应该在片段中使用.setOnClick。

答案 1 :(得分:8)

问题在于,当布局被夸大时,它仍然是接收按钮点击的托管活动,而不是单个碎片。

我更喜欢使用以下解决方案来处理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;
        }
    }
}

然后问题就消失了。

答案 2 :(得分:5)

它对我有用

添加导入:

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

答案 3 :(得分:2)

<强> ISSUE:

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

2.Fragment的公共方法未被调用。

3.片段可重用性。

<强> SOLUTION:

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

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

答案 4 :(得分:0)

您可以让活动中调用的侦听器将调用转发到片段中的侦听器。您应该引用FragmentActivity内部的片段来传递调用。您必须强制转换以调用方法或让您的片段实现您定义的接口。我知道这不是最好的解决方案,但它会起作用。您还可以使用按钮的标记来指定要调用的方法名称。希望这有点帮助。

答案 5 :(得分:0)

试试这个......

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