메인 뷰 / 레이아웃에 이미지를 추가 할 때 런타임 오류가 발생합니다 (둘 다 시도했습니다).
코드는 활동에서 시작하고 게임 보드를 만드는 데 문제가 없습니다. 게임 시작이 완료되면이 모든 것이 잘됩니다. 이 문제는 버튼을 눌러 화면에 이미지를 추가 할 때 발생하며, 뷰가 기본 뷰에 추가되는 순간 런타임 오류가 발생합니다. 내 코드에서 나는 모든 것을 Java로만 유지하고 XML 파일을 피하고 있으며 그것이 문제의 일부일 수 있는지 궁금합니다. 사람들이 레이아웃 인플레이터 방법을 사용하도록 제안한 비슷한 문제에 대한 해결책을 읽고 있었지만 XML 파일 없이는이 방법의 사용에 대한 참조를 찾을 수 없습니다.
내 코드는 다음과 같습니다.
(PS 미리보기 창에서 언젠가 깨지는 모습을 보았습니다 ... 오류 로그가 끝났습니다.
RelativeLayout GameView = new RelativeLayout(this);
GameView.setLayoutParams(new LayoutParams(
screenHei,
screenLen));
//Start Game sequence
ZoomView layout3 = new ZoomView(this);
layout3.setLayoutParams(new LayoutParams(
screenHei,
screenLen));
//Relative layout... aka base view that will be inserted in the zoom view
RelativeLayout baseBoard = new RelativeLayout(this);
//LinearLayOut Setup
baseBoard.setLayoutParams(new LayoutParams(
screenHei,
screenLen));
LinearLayout linearLayout= new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
linearLayout.setLayoutParams(new LayoutParams(
screenHei,
screenLen));
//ImageView Setup
ImageView imageView = new ImageView(this);
//setting image resource
imageView.setImageResource(R.drawable.bluepage);
//setting image position
imageView.setLayoutParams(new LayoutParams(
screenHei,
screenLen));
//adding view to layout
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
linearLayout.addView(imageView);
//make visible to program
linearLayout.setX(0);
linearLayout.setY(0);
// RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
// RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
// lp.addRule(RelativeLayout.BELOW, v.getId());
baseBoard.addView(linearLayout);
layout3.setX(0);
layout3.setY(0);
final RelativeLayout menuMobile = new RelativeLayout(this);
menuMobile.setLayoutParams(new LayoutParams(
200,
200));
menuMobile.setBackgroundColor(0xFF000000 );
Button ButtonMobile1 = new Button(this);
ButtonMobile1.setBackgroundColor(0xFFCCFFCC);
ButtonMobile1.setText("test1");
ButtonMobile1.setTextSize(6);
ButtonMobile1.setLayoutParams(new LayoutParams(155,66));
ButtonMobile1.setX(100);
ButtonMobile1.setY(40);
menuMobile.addView(ButtonMobile1);
ButtonMobile1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.v("prepare to add barrack! "," testing Barrack ");
menuMobile.setVisibility(View.INVISIBLE);
@SuppressWarnings("rawtypes")
ArrayList aList = (ArrayList) GroundWork.get(selectedX);
GameTile axs = (GameTile) aList.get(selectedY);
axs.selected=1;
axs.createBuilding(1,1,1);
addPicture(axs.imgSizeIds);
Log.v("tile selected value and information "," axs.selected :" + axs.selected);
}
});
valueX=21;
valueY=12;
//Base map builder
for(int l=0; l<=valueX; l++){
dimension.clear() ;
for (int w=0; w<=valueY; w++){
// ArrayList<Button> dimension = new ArrayList<Button>();
LinearLayout buttonLayout= new LinearLayout(this);
buttonLayout.setOrientation(LinearLayout.VERTICAL);
buttonLayout.setLayoutParams(new LayoutParams(
40,
40));
buttonLayout.setX(l*40);
buttonLayout.setY(w*40);
System.out.println("Object Creation");
final GameTile Tile = new GameTile();
Tile.onCreate();
Tile.pos_x=l;
Tile.pos_y=w;
System.out.println("Object !! CREATED !!");
System.out.println("Object added to prelim layout");
Button b1 = new Button(this);
b1.setBackgroundColor(0xFFCCFFCC);
b1.setText(" ");
b1.setLayoutParams(new LayoutParams(38,38));
buttonLayout.addView(b1);
baseBoard.addView(buttonLayout);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.v(Tile.button_hit,Tile.button_hit);
// toggleMobileMenu();
menuMobile.setVisibility(View.VISIBLE);
menuMobile.setX(Tile.pos_x*40);
menuMobile.setY(Tile.pos_y*40);
selectedX=Tile.pos_x;
selectedY=Tile.pos_y;
}
});
dimension.add(Tile);
}
GroundWork.add(dimension);
System.out.println(" "+l);
}
LinearLayout linearL = new LinearLayout (this); linearL.setOrientation (LinearLayout.VERTICAL);
linearL.setLayoutParams (new LayoutParams (40, 40));
linearL.setX (300); linearL.setY (340);
ImageView iv = new ImageView (this);
iv.setImageResource (R.drawable.castle);
iv.setX(selectedX*40);
iv.setY(selectedY*40);
linearL.addView(iv);
player1img.add(iv);
linearL.setLayoutParams(new ViewGroup.LayoutParams(40,40));
baseBoard.addView(linearL);
// setContentView(layout);
Log.v("Added view to program", "Added view to program");
imageView.setBackgroundColor(0xFF000000 );
linearLayout.setBackgroundColor(0xFF000000 );
layout3.setBackgroundColor(0xFF000000 );
int ACount;
ACount = GroundWork.size();
System.out.println("ACount");
System.out.println(ACount);
//Casting test
//ArrayList<Button> checking = GroundWork.get(2);
//Temp solution
int BCount;
BCount = dimension.size();
System.out.println("BCount");
System.out.println(BCount);
//Adding final product to view
RelativeLayout menuView = new RelativeLayout(this);
menuView.setLayoutParams(new LayoutParams(
screenHei,
150));
menuView.setBackgroundColor(0xFF000000 );
Button sendUnit = new Button(this);
sendUnit.setBackgroundColor(0xFFCCFFCC);
sendUnit.setText("test");
sendUnit.setTextSize(8);
sendUnit.setLayoutParams(new LayoutParams(155,66));
sendUnit.setX(100);
sendUnit.setY(40);
menuView.addView(sendUnit);
sendUnit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.v(" test "," test ");
menuMobile.setVisibility(View.INVISIBLE);
}
});
layout3.addView(baseBoard);
GameView.addView(layout3);
GameView.addView(menuView);
//Activating final View
setContentView(GameView);
GameView.addView(menuMobile);
}
public void addPicture (int imgSizeIds) {
LinearLayout linearL= new LinearLayout(this);
linearL.setOrientation(LinearLayout.VERTICAL);
linearL.setLayoutParams(new LayoutParams(
40,
40));
linearL.setX(selectedX*40);
linearL.setY(selectedY*40);
Log.v(" Adding Image in view and array "," " + imgSizeIds);
ImageView iv = new ImageView(this);
Log.v(" Setting Image "," " + imgSizeIds);
iv.setImageResource(imgSizeIds);
iv.setImageResource(R.drawable.castle);
Log.v(" Image assigned"," " + imgSizeIds);
iv.setX(selectedX*40);
iv.setY(selectedY*40);
Log.v(" Adding Image in layout "," " + imgSizeIds);
linearL.addView(iv);
// LayoutInflater popupLayoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Log.v(" Adding layout in Mainview "," " + imgSizeIds);
//linearL.showAtLocation(baseBoard, android.view.Gravity.NO_GRAVITY, 100, 100);
//linearL = popupLayoutInflater.inflate(R.layout.baseBoard, null);
linearL.setLayoutParams(new ViewGroup.LayoutParams(40,40));
// RelativeLayout lL = findViewById(baseBoard);
// lL.addView(linearL);
baseBoard.addView(linearL);
Log.v(" Adding in array "," " + imgSizeIds);
player1img.add(iv);
Log.v(" COMPLETED "," " + imgSizeIds);
}
}
오류 기록
08-11 03 : 51 : 38.521 : V / this_is_a_fucking_joke (768) : this_is_a_fucking_joke 08-11 03 : 51 : 39.701 : V / 막사 추가 준비! (768) : 막사 테스트 08-11 03 : 51 : 39.711 : V / CREATING 1 동 (768) : CREATING 1 동
08-11 03 : 51 : 39.711 : V / CREATING building end of object (768) : CREATING building end of object
08-11 03 : 51 : 39.711 : V / 뷰 및 배열에 이미지 추가 (768) : 2130837505 08-11 03 : 51 : 39.711 : V / 설정 이미지 (768) : 2130837505 08-11 03 : 51 : 39.711 : V / 할당 된 이미지 (768) : 2130837505 08-11 03 : 51 : 39.721 : V / 레이아웃에서 이미지 추가 (768) : 2130837505 08-11 03 : 51 : 39.721 : V / 메인 뷰에서 레이아웃 추가 (768) : 2130837505 08- 11 03 : 51 : 39.721 : D / AndroidRuntime (768) : VM 종료 08-11 03 : 51 : 39.721 : W / dalvikvm (768) : threadid = 1 : 잡히지 않은 예외로 스레드 종료 (group = 0x40a71930) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : FATAL EXCEPTION : main 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : java.lang.NullPointerException 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : com.example.test2.GameBoard.addPicture (GameBoard.java:374) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : com.example.test2.GameBoard $ 1.onClick (GameBoard .java : 169) 08-11 03 : 51 : 39.761 :E / AndroidRuntime (768) : android.view.View.performClick (View.java:4204) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : android.view.View $ PerformClick.run (View .java : 17355) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : android.os.Handler.handleCallback (Handler.java:725) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) ) : at android.os.Handler.dispatchMessage (Handler.java:92) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : at android.os.Looper.loop (Looper.java:137) 08- 11 03 : 51 : 39.761 : E / AndroidRuntime (768) : android.app.ActivityThread.main (ActivityThread.java:5041) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : java.lang. reflect.Method.invokeNative (Native Method) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : at java.lang.reflect.Method.invoke (Method.java:511) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:793) 08-11 03 : 51 : 39.761 : E / AndroidRuntime (768) : com.android.internal.os.ZygoteInit.main (ZygoteInit.java:560) 08-11 03:51 : 39.761 : E / AndroidRuntime (768) : dalvik.system.NativeStart.main (Native Method)에서
누군가 내가 뭘 잘못하고 있는지 또는 이해하지 못하는지 알 수 있다면 도움을 주셔서 감사합니다. 범위 문제입니까? 올바른 유형의 컨테이너를 사용하고 있습니까 ... 모르겠습니다 :(
감사@
문제는 baseBoard를 멤버 변수로 선언하지만 onCreate 메서드에서 baseBoard라는 로컬 변수로 마스킹하는 것입니다 (또는 게시 한 코드의 첫 번째 덩어리가 어디에서 왔는지).
내가 생각하는 것은 다음과 같습니다.
public class MyActivity extends Activity {
RelativeLayout baseBoard;
protected void onCreate(Bundle savedInstanceState) {
RelativeLayout baseBoard = new RelativeLayout(this);
}
}
이 코드에서 "baseBoard"라는 두 개의 다른 변수를 선언합니다. onCreate에 선언 된 변수는 "baseBoard"멤버 변수를 마스킹하고 설정되지 않도록합니다. 이것이 클릭 핸들러에서 널 포인터 예외가 발생한 이유입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다