2017-03-08 15 views
0

私はユーザーが署名できるアプリケーションを開発中です。ダイアログのフラグメントのビューからメソッドを呼び出す

私は主なアクティビティを持っていました。メインアクティビティのボタンをクリックすると、キャンバスビューが読み込まれます。このキャンバスには、私がキャンバスを描いた後にキャンバスをクリアするために「クリアキャンバス」のように使うことができるさまざまな方法がありました。

しかし、最近、キャンバスビューを呼び出すレイアウトをダイアログに入れました。

これ以降、ビュー内のメソッドにアクセスできません。

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(); 

    } 
}; 
関連する問題