在onCreate()方法运行之前命名视图时出错

时间:2018-01-17 12:23:51

标签: java android layout-inflater oncreate

运行此代码时,应用程序立即崩溃。

  

错误:java.lang.RuntimeException:无法实例化活动   ComponentInfo {(...)。MainActivity}:java.lang.NullPointerException:   尝试调用虚方法'android.view.Window $ Callback   关于空对象引用的android.view.Window.getCallback()'

通过研究,我能够找出崩溃的原因可能是我在onCreate()方法运行之前命名了两个视图。我可以在onCreate()方法和以下监听器中命名这些视图,但是视图不能公开,因此它们将彼此独立,这将阻止我的应用程序按预期工作。 有没有人知道如何在不使这些视图彼此独立的情况下防止此问题?

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    public ConstraintLayout constraintLayout = (ConstraintLayout) findViewById(R.id.constraint_layout0);
    LayoutInflater inflater = getLayoutInflater();
    public View rectimage3 = inflater.inflate(R.layout.my_rectview, constraintLayout, false);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ImageView rectimage = (ImageView) findViewById(R.id.rectimage);

        //set Listeners
        rectimage.setOnTouchListener(new MySecOnTouchListener());
        rectimage3.setOnTouchListener(new MyOnTouchListener());
        constraintLayout.setOnDragListener(new MyDragListener());
    }

    //OnTouchListener of the first Rect
    private final class MySecOnTouchListener implements View.OnTouchListener {
        public boolean onTouch(View sview, MotionEvent motionEvent){
            int action = motionEvent.getAction();
            if(action == MotionEvent.ACTION_DOWN);
                rectimage3.setVisibility(View.VISIBLE);
                constraintLayout.addView(rectimage3);

                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(rectimage3);
                rectimage3.startDrag(data, shadowBuilder, rectimage3, 0);
                rectimage3.setVisibility(View.INVISIBLE);
                return true;
            } else{
                return false;
            }
        }
    }

    //OnTouchListener of the movable Rects
    private final class MyOnTouchListener implements View.OnTouchListener {
        public boolean onTouch(View view, MotionEvent motionEvent){
            int action = motionEvent.getAction();
            if (action == MotionEvent.ACTION_DOWN) {
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                view.startDrag(data, shadowBuilder, view, 0);
                view.setVisibility(View.INVISIBLE);
                return true;
            } else {
                return false;
            }
        }
    }

    //OnDragListener of the Layout
    class MyDragListener implements View.OnDragListener{
        @Override
        public boolean onDrag(View v, DragEvent event) {
            View view = (View) event.getLocalState();

            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_STARTED:
                    view.setVisibility(View.VISIBLE);
                    break;
                case DragEvent.ACTION_DRAG_LOCATION:
                    view.setX(event.getX()-(view.getWidth()/2));
                    view.setY(event.getY()-(view.getHeight()/2));
                    break;
                case DragEvent.ACTION_DROP:
                    break;
            }
            return true;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您必须仅在main方法内或主方法之后绑定视图和访问方法。

public class MainActivity extends AppCompatActivity {
    public ConstraintLayout constraintLayout;
    LayoutInflater inflater ;
    public View rectimage3 ;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    constraintLayout = (ConstraintLayout) findViewById(R.id.constraint_layout0);
    inflater = getLayoutInflater();
    rectimage3 = inflater.inflate(R.layout.my_rectview, constraintLayout, false);
    final ImageView rectimage = (ImageView) findViewById(R.id.rectimage);

    //set Listeners
    rectimage.setOnTouchListener(new MySecOnTouchListener());
    rectimage3.setOnTouchListener(new MyOnTouchListener());
    constraintLayout.setOnDragListener(new MyDragListener());
}

//OnTouchListener of the first Rect
private final class MySecOnTouchListener implements View.OnTouchListener {
    public boolean onTouch(View sview, MotionEvent motionEvent){
        int action = motionEvent.getAction();
        if(action == MotionEvent.ACTION_DOWN);
            rectimage3.setVisibility(View.VISIBLE);
            constraintLayout.addView(rectimage3);

            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(rectimage3);
            rectimage3.startDrag(data, shadowBuilder, rectimage3, 0);
            rectimage3.setVisibility(View.INVISIBLE);
            return true;
        } else{
            return false;
        }
    }
}

//OnTouchListener of the movable Rects
private final class MyOnTouchListener implements View.OnTouchListener {
    public boolean onTouch(View view, MotionEvent motionEvent){
        int action = motionEvent.getAction();
        if (action == MotionEvent.ACTION_DOWN) {
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(data, shadowBuilder, view, 0);
            view.setVisibility(View.INVISIBLE);
            return true;
        } else {
            return false;
        }
    }
}

//OnDragListener of the Layout
class MyDragListener implements View.OnDragListener{
    @Override
    public boolean onDrag(View v, DragEvent event) {
        View view = (View) event.getLocalState();

        switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                view.setVisibility(View.VISIBLE);
                break;
            case DragEvent.ACTION_DRAG_LOCATION:
                view.setX(event.getX()-(view.getWidth()/2));
                view.setY(event.getY()-(view.getHeight()/2));
                break;
            case DragEvent.ACTION_DROP:
                break;
        }
        return true;
    }
}

}

答案 1 :(得分:1)

试试这个

 public class MainActivity extends AppCompatActivity {
             public ConstraintLayout constraintLayout; 
             LayoutInflater inflater;  
             public View rectimage3;

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       constraintLayout = (ConstraintLayout findViewById(R.id.constraint_layout0);
       inflater = getLayoutInflater();
       rectimage3 = inflater.inflate(R.layout.my_rectview, constraintLayout, false)

答案 2 :(得分:0)

试试这个

public class MainActivity extends AppCompatActivity {
    public ConstraintLayout constraintLayout ;
    LayoutInflater inflater = getLayoutInflater();
    public View rectimage3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final ImageView rectimage = (ImageView) findViewById(R.id.rectimage);
        inflater = getLayoutInflater();
        rectimage3 = inflater.inflate(R.layout.my_rectview, 
        constraintLayout, 
       false)
       ; //set Listeners
        rectimage.setOnTouchListener(new MySecOnTouchListener());
        rectimage3.setOnTouchListener(new MyOnTouchListener());
        constraintLayout.setOnDragListener(new MyDragListener());
    }

    //OnTouchListener of the first Rect
    private final class MySecOnTouchListener implements View.OnTouchListener {
        public boolean onTouch(View sview, MotionEvent motionEvent){
            int action = motionEvent.getAction();
            if(action == MotionEvent.ACTION_DOWN);
                rectimage3.setVisibility(View.VISIBLE);
                constraintLayout.addView(rectimage3);

                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(rectimage3);
                rectimage3.startDrag(data, shadowBuilder, rectimage3, 0);
                rectimage3.setVisibility(View.INVISIBLE);
                return true;
            } else{
                return false;
            }
        }
    }

    //OnTouchListener of the movable Rects
    private final class MyOnTouchListener implements View.OnTouchListener {
        public boolean onTouch(View view, MotionEvent motionEvent){
            int action = motionEvent.getAction();
            if (action == MotionEvent.ACTION_DOWN) {
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                view.startDrag(data, shadowBuilder, view, 0);
                view.setVisibility(View.INVISIBLE);
                return true;
            } else {
                return false;
            }
        }
    }

    //OnDragListener of the Layout
    class MyDragListener implements View.OnDragListener{
        @Override
        public boolean onDrag(View v, DragEvent event) {
            View view = (View) event.getLocalState();

            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_STARTED:
                    view.setVisibility(View.VISIBLE);
                    break;
                case DragEvent.ACTION_DRAG_LOCATION:
                    view.setX(event.getX()-(view.getWidth()/2));
                    view.setY(event.getY()-(view.getHeight()/2));
                    break;
                case DragEvent.ACTION_DROP:
                    break;
            }
            return true;
        }
    }
}