我正在开发一个允许用户签名的应用程序。
我有一个主要活动,当我点击主活动上的按钮时,它会加载画布视图。在这个画布上有各种各样的方法,我可以使用像“Clear Canvas”来清理我的画布后画画。
但是,我最近把调用Canvas View的布局放到了一个对话框中。
从那时起,我无法在视图中访问我的方法。
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");
}
});
}
}
这是我的Dialog Fragment,其中包含我尝试从View 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 :(得分:1)
不是最干净的做事方式,而是尝试:
View.OnClickListener myhandler1 = new View.OnClickListener() {
public void onClick(View v) {
((CanvasView)v.findViewById(R.id.*your-canvas-view-id*)).clearCanvas();
}
};
答案 1 :(得分: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;
}