0

在我的Xamarin Forms Android項目中,我使用CustomMapRenderer顯示Map。我在地圖屏幕上彈出一個Info Window,這個信息窗口有一個叫做"Call"的按鈕名稱。我需要對此按鈕執行一次"OnCLick"按鈕單擊操作。我使用了Google,但不幸的是我沒有遇到任何解決方案。最後我開始着手將Android Native code -Java轉換爲Xamarin Forms Android -c#,對於這種轉換我一直在使用這個答案Google Maps Android API v2 - Interactive InfoWindow (like in original android google maps)。此轉換後的代碼顯示A field initializer cannot reference the non static field, method or property OnInfoWindowElemTouchListener.onClickConfirmed(view, marker)錯誤裏面Java.Lang.Runnable請幫我解決問題。如何在Xamarin中點擊按鈕表單Android自定義信息窗口

OnInfoWindowElemTouchListener.cs

using System.Threading.Tasks; 
    using Android.App; 
    using Android.Content; 
    using Android.Gms.Maps.Model; 
    using Android.Graphics.Drawables; 
    using Android.OS; 
    using Android.Views; 
    using Android.Views.Accessibility; 

    using Java.Lang; 

    namespace Hotel.Droid 
    { 
     public abstract class OnInfoWindowElemTouchListener : Java.Lang.Object 
     , View.IOnTouchListener 
     { 
      private View view; 

      private Drawable bgDrawableNormal; 
      private Drawable bgDrawablePressed; 
      private Handler handler = new Handler(); 
      private Marker marker; 
      private static bool endPressStatus = false; 
      private bool pressed = false; 


      public OnInfoWindowElemTouchListener(View view, Drawable bgDrawableNormal, Drawable bgDrawablePressed) 
      { 
       this.view = this.view; 
       this.bgDrawableNormal = this.bgDrawableNormal; 
       this.bgDrawablePressed = this.bgDrawablePressed; 
      } 
      public OnInfoWindowElemTouchListener() 
      { 

      } 

      public void setMarker(Marker marker) 
      { 
       this.marker = this.marker; 
      } 



      public bool OnTouch(View vv, MotionEvent e) 
      { 
       if (0 <= e.GetX() && e.GetX() <= vv.Width && 0 <= e.GetY() && e.GetY() <= vv.Height) 
       { 
        switch (e.ActionMasked) 
        { 
         case MotionEventActions.Down: 
          startPress(); 
          break; 

         // We need to delay releasing of the view a little so it shows the 
         // pressed state on the screen 
         case MotionEventActions.Up: 
          //handler.PostDelayed(ConfirmClickRunnable, 150); 
Task.Factory.StartNew(() => onClickConfirmed(view, marker)); 
Task.Delay(150); 
          break; 

         case MotionEventActions.Cancel: 
          endPress(); 
          break; 
         default: 
          break; 
        } 
       } 
       else { 
        // If the touch goes outside of the view's area 
        // (like when moving finger out of the pressed button) 
        // just release the press 
        endPress(); 
       } 

       return false; 
      } 


      private void startPress() 
      { 
       if (!pressed) 
       { 
        pressed = true; 
        //handler.RemoveCallbacks(ConfirmClickRunnable); 
        view.SetBackgroundDrawable(bgDrawablePressed); 
        if ((marker != null)) 
        { 
         marker.ShowInfoWindow(); 
        } 

       } 

      } 

      public bool endPress() 
      { 
       if (pressed) 
       { 
        this.pressed = false; 
        handler.RemoveCallbacks(ConfirmClickRunnable); 
        view.SetBackgroundDrawable(bgDrawableNormal); 


        if ((marker != null)) 
        { 
         marker.ShowInfoWindow(); 
        } 
        endPressStatus = true; 
        return true; 
       } 
       else { 
        endPressStatus = false; 
        return false; 
       } 

      } 

      private Runnable ConfirmClickRunnable = new Java.Lang.Runnable(() => 
      { 
       if (endPressStatus) 
       { 

        onClickConfirmed(view, marker); 
       } 
      }); 




      /*private class RunnableAnonymousInnerClassHelper : Java.Lang.Object, Java.Lang.IRunnable 
      { 
       private readonly Context outerInstance;  

       public RunnableAnonymousInnerClassHelper(Context outerInstance) 
       { 
        this.outerInstance = outerInstance;   
       } 

       public void Run() 
       { 
        if (endPressStatus) 
        { 
         onClickConfirmed(); 
        } 
       } 
      }*/ 


      protected abstract void onClickConfirmed(View v, Marker marker); 


     } 

    } 

enter image description here

更新

我已經實現了Task.Factory.StartNew代替Android Runnable,現在我stucking在以下線。我很努力地將Java代碼轉換爲C#,因爲它是由Anonymous類概念編寫的。

的Java

this.infoButtonListener = new OnInfoWindowElemTouchListener(infoButton, 
       getResources().getDrawable(R.drawable.btn_default_normal_holo_light), 
       getResources().getDrawable(R.drawable.btn_default_pressed_holo_light)) 
     { 
      @Override 
      protected void onClickConfirmed(View v, Marker marker) { 
       // Here we can perform some action triggered after clicking the button 
       Toast.makeText(MainActivity.this, marker.getTitle() + "'s button clicked!", Toast.LENGTH_SHORT).show(); 
      } 
     }; 
     this.infoButton.setOnTouchListener(infoButtonListener); 

infoButton代碼是呼叫按鈕

C# - 請幫我通過轉換/使用(如何使用)上面的Java代碼

來解決問題
+0

代碼過於複雜(至少對我來說),給你一個答案,但如果你共享你的樣本項目,我可以嘗試看看 –

+0

分享您'電子郵件id'我會送 – Jamal

+0

你可以將它張貼在Dropbox或github上,如果你需要幫助 –

回答

1

該窗口的解決方案過於複雜。請參閱聊天室一步一步的解決方案。 http://chat.stackoverflow.com/rooms/128847/discussion-between-jamal-and-yuri-s

+0

我已經在'Google Drive'中上傳了示例工作項目代碼,請你檢查並幫助完成這個問題?這裏https://drive.google.com/file/d/0Bwrd--0WzaM2Ry1jdzI3alZSeDQ/view?usp=sharing你可以得到代碼。 **注意:**清理並右鍵單擊'CustomRenderer.Droid'然後構建。 – Jamal

+0

您現在遇到的問題是什麼? –

+0

我沒有任何'語法錯誤'在我的代碼中,我可以建立沒有錯誤的代碼。我無法「執行操作(調用方法)」,同時點擊「調用」按鈕。 – Jamal

相關問題