运行此代码时,应用程序立即崩溃。
错误: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;
}
}
}
答案 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;
}
}
}