【问题标题】:onClick inside fragment called on ActivityonClick 内部片段调用 Activity
【发布时间】:2011-09-27 14:11:03
【问题描述】:

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

【问题讨论】:

标签: android android-fragments


【解决方案1】:

我与一些谷歌员工@#adl2011 进行了交谈 - 他们认识到了这个问题,也许将来会解决这个问题。在那之前 - 应该在 Fragment 中使用 .setOnClick。

【讨论】:

  • 呵呵,你是S.O.上第一个诚实的人。这么说。其他人都试图用荒谬的解释来掩盖这个问题。
  • 我不知道这个问题是否有解决方案,但是当尝试访问一个复选框时这会变得很麻烦,因为 OnClickListener 不会在那里工作。
  • 天啊,当谷歌说他们会修复它时,他们会修复它。无需每 6 个月提醒一次!
  • 对,已经 4 年多了 :)
  • 当您打开要处理 onClick 事件的片段时,请尝试替换它而不是仅将其添加到活动之上。
【解决方案2】:

问题在于,当布局膨胀时,接收按钮点击的仍然是托管 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;
        }
    }
}

那么问题就解决了。

【讨论】:

    【解决方案3】:

    对我有用

    添加导入:

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

    【讨论】:

      【解决方案4】:

      问题:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 是的......不是一个干净或方便的解决方案,试图从下到上跌倒......
        【解决方案6】:

        试试这个...

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-20
          相关资源
          最近更新 更多