【问题标题】:How can I take listener methods out of their scope in Java?如何在 Java 中将侦听器方法超出其范围?
【发布时间】:2011-11-23 14:58:39
【问题描述】:
public class SomeClass {
    public void SomeMethod() {
        GridView gv = new GridView(this);
        gv.setOnClickListener(new GridView.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
            }

        });
    }

    // Define onClick here and reference it somehow above?

}

如何将onClick 方法从该代码块中取出到类的根目录中?例如,您可以在 C# 上执行此操作。

【问题讨论】:

    标签: java android methods scope


    【解决方案1】:

    简单,只需实现 OnClickListener 接口。

    public class SomeClass extends Activity implements OnClickListener 
    
     // Implement the OnClickListener callback
        public void onClick(View v) {
          // check the view type : Use View v to check which view is this called for using getId () 
        }
        ...
    

    请注意,在进行处理之前,您必须检查单击了哪个视图。

    【讨论】:

      【解决方案2】:

      创建以下内部类

      class click implements OnClicklIstener
      {
       public void onClick(View v) {
            // do your stuff
          }
      
      }
      

      gv.setOnClickListener(new click());
      

      【讨论】:

        【解决方案3】:

        您可以将侦听器声明为任何其他类属性:

        public class HomeActivity extends Activity {
        
         public void SomeMethod() {
                GridView gv = new GridView(this);
                gv.setOnClickListener(gridClickedListener);
            }
        
         private GridView.OnClickListener gridClickedListener =  new GridView.OnClickListener() {
        
                    @Override
                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                    }
        
                });
        }
        

        或实现 OnClickListener(或其他)接口,但如果有多个视图将报告给此侦听器,您将需要知道单击了哪个视图(在 OnClick 处理程序内切换)。我倾向于不使用这种方法 - 它对我来说看起来不太可读。

        【讨论】:

          【解决方案4】:

          像这样:

          public class SomeClass {
              public void SomeMethod() {
                  GridView gv = new GridView(this);
                  gv.setOnClickListener(new GridView.OnClickListener() {
          
                      @Override
                      public void onClick(View view) {
                          SomeClass.this.onClick(view);
                      }
          
                  });
              }
          
              public void onClick(View view) {
                  // implement me please
              }
          
          }
          

          【讨论】:

            【解决方案5】:
            public class SomeClass extends Activity implements View.OnClickListener 
            {
            GridView gv;
             public void SomeMethod() {
                    gv = new GridView(this);
                    gv.setOnClickListener(this); 
                 }
            
               @Override
               public void onClick(View v) {
               if(v==gv)
               {
                  // do something when the button is clicked
               }
            }
            

            【讨论】:

            • 这不起作用,因为 GridView 是在 SomeMethod() 范围内声明的。然后您不能在 onClick 方法中使用语句if (v==gv),gv 在这里不可见。除非您在类范围内定义 GridView。
            • 你同意,但我给出的想法不是代码的完整实现
            【解决方案6】:

            这不行吗?

            public class SomeClass implements GridView.OnClickListener {
                public void SomeMethod() {
                    GridView gv = new GridView(this);
                    gv.setOnClickListener(this);
                }
            
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                }
            }
            

            【讨论】:

              猜你喜欢
              • 2021-11-19
              • 2021-05-07
              • 1970-01-01
              • 2023-03-27
              • 2013-10-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-19
              相关资源
              最近更新 更多