2017-03-08 50 views
0

我正在研究允許用戶簽名的應用程序。從對話框片段中查看調用方法

我有一個主要活動,當我點擊我的主要活動按鈕時,它加載了一個畫布視圖。在這個畫布上有各種方法,我可以使用像「清除畫布」清除畫布後,我畫了它。

但是,我最近把調用Canvas視圖的佈局放到對話框中。

從那以後,我無法在視圖中訪問我的方法。

View.OnClickListener myhandler1 = new View.OnClickListener() { 
     public void onClick(View v) { 
      ((CanvasView)getView()).clearCanvas(); //Error here 

     } 
    }; 

錯誤

java.lang.ClassCastException: android.widget.FrameLayout cannot be cast to signaturepad.CanvasView 

活動主(注意最後一個按鈕,它調用我們的片段)

public class MainActivity extends AppCompatActivity { 

     final Context context = this; 
     Button dfragbutton; 
     Button alertdfragbutton; 
     FragmentManager fm = getSupportFragmentManager(); 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 


      Button button = (Button) findViewById(R.id.otherdialog); 
      // add button listener 
      button.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 

        // custom dialog 
        final Dialog dialog = new Dialog(context); 
        dialog.setContentView(R.layout.signature_layout); 
        dialog.setTitle("Title..."); 


        TextView text = (TextView) dialog.findViewById(R.id.text); 
        text.setText("Android custom dialog example!"); 
        ImageView image = (ImageView) dialog.findViewById(R.id.image); 
        image.setImageResource(R.drawable.androidhappy); 
dialog.show(); 
       } 
      }); 




       Button sign_btn = (Button) findViewById(R.id.sign_btn); 
      sign_btn.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Intent Intent = new Intent(view.getContext(), CanvasActivity.class); 
        view.getContext().startActivity(Intent); 
       } 
      }); 
    dfragbutton = (Button) findViewById(R.id.dfragbutton); 

      // Capture button clicks 
      dfragbutton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View arg0) { 
        DFragment dFragment = new DFragment(); 
        // Show DialogFragment 
        dFragment.show(fm, "Dialog Fragment"); 
       } 
      }); 



     } 
    } 

這是我們的對話片段與方法,我嘗試訪問查看CanvasView。

public class DFragment extends DialogFragment { 
    private CanvasView customCanvas; 
Button clearButton; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.newsignature_layout, container, 
       false); 
     getDialog().setTitle("DialogFragment"); 
     // Do something else 

     Button clearCanvas = (Button)rootView.findViewById(R.id.newbutton1); 
     clearCanvas.setOnClickListener(myhandler1); 
     return rootView; 
    } 

    View.OnClickListener myhandler1 = new View.OnClickListener() { 
     public void onClick(View v) { 
      ((CanvasView)getView()).clearCanvas(); //Error here 

     } 
    }; 

/* 
    public void clearCanvas(View v) { customCanvas.clearCanvas(); } 
*/ 
} 
+0

你的CanvasView有一個ID? – Distwo

+0

您正在將整個佈局轉換爲CanvasView。我認爲你的佈局中有一個CanvasView?請發佈R.layout.newsignature_layout的內容 – burntsugar

回答

0

你所得到的錯誤是由於您鑄造認爲getView回報率(也就是圖中的片段,你誇大; FrameLayout)至CanvasView。只要做到這一點:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.newsignature_layout, container, 
      false); 
    getDialog().setTitle("DialogFragment"); 

    Button clearCanvas = (Button)rootView.findViewById(R.id.newbutton1); 
    customCanvas = (CanvasView)rootView.findViewById(R.id.*your-canvas-id*); 

    clearCanvas.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       customCanvas.clearCanvas(); 
      } 
     }); 
    return rootView; 
} 
1

沒有做的事情,但嘗試最徹底的方法:

View.OnClickListener myhandler1 = new View.OnClickListener() { 
    public void onClick(View v) { 
     ((CanvasView)v.findViewById(R.id.*your-canvas-view-id*)).clearCanvas(); 

    } 
}; 
相關問題