2017-03-08 51 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(); 

    } 
}; 
相关问题