【问题标题】:Issue with onClickListener for Button in Fragment片段中按钮的 onClickListener 问题
【发布时间】:2015-04-15 02:38:07
【问题描述】:

我在片段类中有一个按钮,我想在父活动中触发一个方法。我已经为此实现了一个接口。

我的问题是 View.onClickListener 给了我以下错误:

类“从 onClickListener 派生的匿名类”必须声明为抽象或在“onClickListener”中实现抽象方法“onClick(View)”

这很奇怪,因为我正在实现 onClick(View)。

这是我的片段中的代码:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(com.zlaporta.chessgame.R.layout.gamedescfragment, container, false);
        final Button make_move = (Button) v.findViewById(R.id.make_move);
        make_move.setOnClickListener(new ***View.OnClickListener()*** {
            public void OnClick(View v) {
                makeMoveCallback.makeMoveMethod();
            }
        });

星号表示 Android Studio 不喜欢的代码部分。

【问题讨论】:

    标签: java android onclicklistener


    【解决方案1】:

    在对象中使用匿名内部类:

    //declaring OnClickListener as an object
    private OnClickListener btnClick = new OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
    
        }
    };
    
    //passing listener object to button
    make_move.setOnClickListener(btnClick);
    

    希望这会有所帮助:)

    【讨论】:

    • 这行得通,但为什么呢?我更传统的实现有什么问题?
    • 因为 OnClickListener 是一个接口,并且通过使用 new OnClickListener() 作为 make_move.setOnClickListener 的参数,它实际上是在创建一个实现 OnClickListener 的匿名内部类。并且必须声明 onClick 方法,因为它是该接口类中的抽象方法:)
    【解决方案2】:

    只是一个错字:替换方法名

    OnClick
    

    onClick
    

    【讨论】:

      【解决方案3】:

      您可以尝试从方法中传递 OnClickListener

      例如,

      private View.OnClickListener getButtonOnClickListener() {
          return new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  // this is the code
              }
          };
      }
      

      然后使用make_move.setOnClickListener(getButtonOnClickListener());

      【讨论】:

        【解决方案4】:

        这是对按钮使用点击事件的最佳方式。使用 onClick 监听器实现。使用下面的代码。

        public class MyFragment extends Fragment implements OnClickListener {
        Button mButton;
        
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,   Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.main_layout, null);
            mButton = (Button) view.findViewById(R.id.button1);
            mButton.setOnClickListener(this);
        
            return view;
        }
        
        @Override
        public void onClick(View v) {
        
            if (v == mButton) {
                // Do something on click button
            }
        
        }
        }
        

        如果单独使用每个点击事件,它会占用更多空间。最好使用此代码。

        【讨论】:

          【解决方案5】:

          onClick方法上方添加@Override

          【讨论】:

          • 那行不通。 '方法不会覆盖它的超类中的方法'
          • 是 Android 的 View.OnClickListener 还是已更改?基本上错误表明您没有在接口 OnClickListener 中实现方法。但是您已经或应该拥有哪个是 public void onClick(View v)。如果您使用像 Android Stuido 之类的 IDE,也许您应该删除它,重新开始,让 IDE 生成实现。
          【解决方案6】:

          或者你可以在FragmentOnActivityCreated()方法中使用下面的按钮点击监听器方法。

          make_move.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View view) {
          
                            makeMoveCallback.makeMoveMethod();
          
                    }
          });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-26
            • 1970-01-01
            相关资源
            最近更新 更多