从对话框片段中调用视图方法

时间:2017-03-08 21:13:45

标签: android android-fragments canvas

我正在开发一个允许用户签名的应用程序。

我有一个主要活动,当我点击主活动上的按钮时,它会加载画布视图。在这个画布上有各种各样的方法,我可以使用像“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(); }
*/
}

2 个答案:

答案 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;
}