2013-01-10 3 views
3

사용자 정의 대화 상자 (또는 실제로 Android 프로그래밍)로 작업하지 않았기 때문에 곰이 나와 함께 있습니다. 나는 어리석은 초보자 실수를 저질렀습니다.Android 사용자 정의 대화 상자와 상호 작용할 수 없습니다.

그래서 저는 기존의 응용 프로그램에 통합하려고하는 간단한 주사위 굴림 응용 프로그램을 가지고 있지만 본질적으로 팝업으로 처리하려고합니다. 지금까지 내가 찾은 해결책은 대화 상자 클래스를 확장하고 응용 프로그램의 xml을 사용자 정의 레이아웃으로 사용하는 것이 었습니다. 실제로 예상되는 출력을 표시하지만 화면에서 주사위를 보여 주지만 굴릴 수는 없습니다.).

내가 전화 한 자바 클래스는 이것이다 :

import java.io.IOException; 
import java.util.Random; 
import com.zeldar.scanner.R; 
import android.app.Activity; 
import android.content.res.Resources; 
import android.graphics.drawable.Drawable; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.media.MediaPlayer; 

import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 

public class RollDice extends Activity implements SensorEventListener { 
    private final int rollAnimations = 50; 
    private final int delayTime = 15; 
    private Resources res; 
    private final int[] diceImages = new int[] { R.drawable.d1, R.drawable.d2, R.drawable.d3, R.drawable.d4, R.drawable.d5, R.drawable.d6 }; 
    private Drawable dice[] = new Drawable[6]; 
    private final Random randomGen = new Random(); 
    @SuppressWarnings("unused") 
    private int diceSum; 
    private int roll[] = new int[] { 6, 6 }; 
    private ImageView die1; 
    private ImageView die2; 
    private LinearLayout diceContainer; 
    private SensorManager sensorMgr; 
    private Handler animationHandler; 
    private long lastUpdate = -1; 
    private float x, y, z; 
    private float last_x, last_y, last_z; 
    private boolean paused = false; 
    private static final int UPDATE_DELAY = 50; 
    private static final int SHAKE_THRESHOLD = 400; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     paused = false; 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.dice); 
     setTitle(getString(R.string.app_name)); 
     res = getResources(); 
     for (int i = 0; i < 6; i++) { 
      dice[i] = res.getDrawable(diceImages[i]); 
     } 
     diceContainer = (LinearLayout) findViewById(R.id.diceContainer); 
     diceContainer.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        rollDice(); 
       } catch (Exception e) {}; 
      } 
     }); 
     die1 = (ImageView) findViewById(R.id.die1); 
     die2 = (ImageView) findViewById(R.id.die2); 
     animationHandler = new Handler() { 
      public void handleMessage(Message msg) { 
       die1.setImageDrawable(dice[roll[0]]); 
       die2.setImageDrawable(dice[roll[1]]); 
      } 
     }; 
     sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE); 
     boolean accelSupported = sensorMgr.registerListener(this, 
       sensorMgr.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME); 
     if (!accelSupported) sensorMgr.unregisterListener(this); //no accelerometer on the device 
     rollDice(); 
    } 

    private void rollDice() { 
     if (paused) return; 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       for (int i = 0; i < rollAnimations; i++) { 
        doRoll(); 
       } 
      } 
     }).start(); 
     MediaPlayer mp = MediaPlayer.create(this, R.raw.roll); 
     try { 
      mp.prepare(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     mp.start(); 
    } 

    private void doRoll() { // only does a single roll 
     roll[0] = randomGen.nextInt(6); 
     roll[1] = randomGen.nextInt(6); 
     diceSum = roll[0] + roll[1] + 2; // 2 is added because the values of the rolls start with 0 not 1 
     synchronized (getLayoutInflater()) { 
      animationHandler.sendEmptyMessage(0); 
     } 
     try { // delay to alloy for smooth animation 
      Thread.sleep(delayTime); 
     } catch (final InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void onResume() { 
     super.onResume(); 
     paused = false; 
    } 

    public void onPause() { 
     super.onPause(); 
     paused = true; 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     Sensor mySensor = event.sensor; 
     if (mySensor.getType() == SensorManager.SENSOR_ACCELEROMETER) { 
      long curTime = System.currentTimeMillis(); 
      if ((curTime - lastUpdate) > UPDATE_DELAY) { 
       long diffTime = (curTime - lastUpdate); 
       lastUpdate = curTime; 
       x = event.values[SensorManager.DATA_X]; 
       y = event.values[SensorManager.DATA_Y]; 
       z = event.values[SensorManager.DATA_Z]; 
       float speed = Math.abs(x + y + z - last_x - last_y - last_z)/diffTime * 10000; 
       if (speed > SHAKE_THRESHOLD) { //the screen was shaked 
        rollDice(); 
       } 
       last_x = x; 
       last_y = y; 
       last_z = z; 
      } 
     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     return; //this method isn't used 
    } 
} 

을 그리고 이것은 레이아웃 XML입니다 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

    android:id="@+id/diceContainer" 
    android:orientation="vertical" 
    android:gravity="center" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" > 

    <ImageView 
     android:id="@+id/die1" 
     android:src="@drawable/d6" 
     android:layout_width="150dp" 
     android:layout_height="150dp" 
     android:layout_marginBottom="15dp" 
     android:contentDescription="@string/content_dice" /> 

    <ImageView 
     android:id="@+id/die2" 
     android:src="@drawable/d6" 
     android:layout_width="150dp" 
     android:layout_height="150dp" 
     android:contentDescription="@string/content_dice" /> 

</LinearLayout> 

마지막으로, 나는이 대화 상자를 만드는 데 사용하고 전화 :

private Dialog rollDice; 

rollDice = new Dialog(ScanActivity.this); 
rollDice.setContentView(R.layout.dice); 
rollDice.setTitle("Roll Dice"); 
rollDice.setCancelable(true); 
rollDice.show(); 

명확히하기 : 가장 혼란스러운 부분은 컴파일이나 실행 중 오류가 발생하지 않는다는 것입니다. e 창을 열고 나에게 아무것도하지 못하게 할 것입니다 (해고를 제외하고)!

답변

1

대화 상자와 같은 것을 원한다면 대화 상자 테마로 액티비티를 사용하는 것이 좋습니다. 이렇게하면 대화 상자처럼 "팝업"할 수 있지만 더 유연하고 조작하기 쉬워집니다. 열고

Themes

이 작업을 수행 할 수있는 더 좋은 방법이있을 수 있습니다하지만이 당신을 위해 잘 작동 것 같아요

<activity android:theme="@android:style/Theme.Dialog">

활동에 대한 매니페스트에이를 추가하기 위해 별도의 작업을 만듭니다.

+0

실제로 큰 도움이되었습니다. 감사합니다. 줄 103 (mp.start)에서 NullException이 발생하지만 지금은 "MediaPlayer"전체 섹션을 주석 처리했으며 (이는 주사위 롤링 - 불필요) 예상대로 수행됩니다! –

+0

너무 놀라지 말라;) 기꺼이 도와 줬어! – codeMagic

관련 문제