代码之家  ›  专栏  ›  技术社区  ›  user432209

无法在活动内调用视图对象的方法

  •  1
  • user432209  · 技术社区  · 14 年前

    在我的程序中,我有一个自定义视图对象。视图类中有一个名为foo的方法。出于某种原因,当我在活动中给foo打电话时,它不会开火。代码如下:

    <com.company.application.MyView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    

    活动代码:

    public class Main extends Activity {
    
        MyView mView;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View v = li.inflate(R.layout.main, null);   
            mView= (MyView) v.findViewById(R.id.my_view);
    
            //A button to fire the method inside foo()
            Button switchLeft = (Button) findViewById(R.id.switch_left);
            switchLeft.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    callTest();
                }
            });
        }
    
        public void callTest() {
            Log.w(this.getClass().getName(), "clicked left arrow");
            mView.foo();
            mView.postInvalidate();
    
        }
    }
    

    最后是foo:

    public void foo() {
        mBackground = mContext.getResources().getDrawable(R.drawable.temp_canvas);
        Log.w(this.getClass().getName(), "background set");
    }
    

    第一个日志总是在按下按钮时写入,但第二个日志并不是因为foo从不触发。这是怎么回事?

    编辑:根据要求,全视图

    public class MyView extends View {
    
        Drawable mBackground;
    
        Context mContext;
    
        public MyView (Context context) {
            super(context);
            mContext = context;
            mBackground = mContext.getResources().getDrawable(R.drawable.leftarrow1);
        }
    
        public MyView (Context context, AttributeSet attrs) {
            super(context, attrs);
            mContext = context;
            mBackground = mContext.getResources().getDrawable(R.drawable.leftarrow1);
        }
    
        public void foo() {
            mBackground = mContext.getResources().getDrawable(R.drawable.temp_canvas);
            Log.w(this.getClass().getName(), "background set");
        }
    
        @Override
        public void onDraw(Canvas canvas) {
            Paint paint = new Paint();
            paint.setStyle(Paint.Style.FILL);
    
            // draw a solid blue circle
            paint.setColor(Color.BLUE);
            canvas.drawCircle(20, 20, 15, paint);
    
            // draw a test background
            mBackground.setBounds(0, 0, 300, 400);
            mBackground.draw(canvas);
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   user432209    14 年前

    在重新启动模拟器之后,foo()现在被调用,它只是没有正确设置背景…但这是另一个问题。