太长放不下。这是后面一部分。  /* 恢復原有的Layout可視性 */
  private void recoverOriginalLayout()
  {
    mTextView01.setVisibility(View.VISIBLE);
    mEditText01.setVisibility(View.VISIBLE);
    mImageView01.setVisibility(View.GONE);
  }
  
  /* 隱藏原有應用程式裡的版面配置元件 */
  private void hideOriginalLayout()
  {
    /* 將欲隱藏的Widget寫在此 */
    mTextView01.setVisibility(View.INVISIBLE);
    mEditText01.setVisibility(View.INVISIBLE);
  }
  
  /* 開始ScreenSaver */
  private void showScreenSaver()
  {
    /* 螢幕保護之後要做的事件寫在此*/
    
    if(intDrawable>4)
    {
      intDrawable = 0;
    }
    
    DisplayMetrics dm=new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    screenWidth = dm.widthPixels;
    screenHeight = dm.heightPixels;
    Bitmap bmp=BitmapFactory.decodeResource(getResources(), screenDrawable[intDrawable]);
    
    /* Matrix比例 */ 
    float scaleWidth = ((float) screenWidth) / bmp.getWidth();
    float scaleHeight = ((float) screenHeight) / bmp.getHeight() ;
    
    Matrix matrix = new Matrix(); 
    /* 使用Matrix.postScale設定維度ReSize */ 
    matrix.postScale(scaleWidth, scaleHeight);
    
    /* ReSize圖檔至螢幕解析度 */
    Bitmap resizedBitmap = Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),bmp.getHeight(),matrix,true);
    BitmapDrawable myNewBitmapDrawable = new BitmapDrawable(resizedBitmap); 
    mImageView01.setImageDrawable(myNewBitmapDrawable);
    
    /* 使ImageView可見 */
    mImageView01.setVisibility(View.VISIBLE);
    
    /* 每間隔設定秒數置換圖片ID,於下一個runnable2才會生效 */
    if(intCounter2%intSecondsToChange==0)
    {
      intDrawable++;
    }
  }
  
  public void onUserWakeUpEvent()
  {
    if(bIfRunScreenSaver==true)
    {
      try
      {
        /* LayoutInflater.from取得此Activity的context */
        mInflater01 = LayoutInflater.from(EX07_03.this);
        
        /* 建立解鎖密碼使用View的Layout */
        mView01 = mInflater01.inflate(R.layout.securescreen, null);
        
        /* 於對話方塊中唯一的EditText等待輸入解鎖密碼 */
        mEditText02 = (EditText) mView01.findViewById(R.id.myEditText2);        
        /* 建立AlertDialog */
        new AlertDialog.Builder(this)
        .setView(mView01)
        .setPositiveButton("OK",
        new DialogInterface.OnClickListener()
        {
          public void onClick(DialogInterface dialog, int whichButton)
          {
            /* 比對輸入的密碼與原Activity裡的設定是否相符 */
            if(mEditText01.getText().toString().equals(mEditText02.getText().toString()))
            {
              /* 當密碼正確才真的解鎖螢幕保護裝置 */
              resetScreenSaverListener();
            }
          }
        }).show();
              }
      catch(Exception e)
      {
        e.printStackTrace();
      }
    }
  }
  
  public void updateUserActionTime()
  {
    /* 取得按下按鍵事件時的系統Time Millis */
    Date timeNow = new Date(System.currentTimeMillis());
    /* 重新計算按下按鍵距離上一次靜止的時間間距 */
    timePeriod = (long)timeNow.getTime() - (long)lastUpdateTime.getTime();
    lastUpdateTime.setTime(timeNow.getTime());
  }
  
  public void resetScreenSaverListener()
  {
    /* 移除現有的Runnable */
    mHandler01.removeCallbacks(mTasks01);
    mHandler02.removeCallbacks(mTasks02);
    
//    /* 取得按下按鍵事件時的系統Time Millis */
//    Date timeNow = new Date(System.currentTimeMillis());
//    /* 重新計算按下按鍵距離上一次靜止的時間間距 */
//    timePeriod = (long)timeNow.getTime() - (long)lastUpdateTime.getTime();
//    lastUpdateTime.setTime(timeNow.getTime());
    updateUserActionTime();
    
    /* for Runnable2,取消螢幕保護 */
    bIfRunScreenSaver = false;
    
    /* 重置Runnable1與Runnable1的Counter */
    intCounter1 = 0;
    intCounter2 = 0;
    
    /* 恢復原來的Layout Visible*/
    recoverOriginalLayout();
    
    /* 重新postDelayed()新的Runnable */
    mHandler01.postDelayed(mTasks01, intervalKeypadeSaver);
  }
  
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event)
  {
    // TODO Auto-generated method stub
    if(bIfRunScreenSaver==true && keyCode!=KeyEvent.KEYCODE_BACK)
    {
      /* 當螢幕保護程式正在執行中,觸動解除螢幕保護程式 */
      onUserWakeUpEvent();
    }
    else
    {
      /* 更新User未觸動手機的時間戳記 */
      updateUserActionTime();
    }
    return super.onKeyDown(keyCode, event);
  }  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    // TODO Auto-generated method stub
    if(bIfRunScreenSaver==true)
    {
      /* 當螢幕保護程式正在執行中,觸動解除螢幕保護程式 */
      onUserWakeUpEvent();
    }
    else
    {
      /* 更新User未觸動手機的時間戳記 */
      updateUserActionTime();
    }
//    return super.onTouchEvent(event);
    return false;
  }
  
  @Override
  protected void onResume()
  {
    // TODO Auto-generated method stub
    mHandler01.postDelayed(mTasks01, intervalKeypadeSaver);
    super.onResume();
  }
  
  @Override
  protected void onPause()
  {
    // TODO Auto-generated method stub
    
    try
    {
      /* 移除執行中的執行緒 */
      mHandler01.removeCallbacks(mTasks01);
      mHandler02.removeCallbacks(mTasks02);
      mHandler03.removeCallbacks(mTasks03);
      mHandler04.removeCallbacks(mTasks04);
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
    super.onPause();
  }
}

解决方案 »

  1.   

    提示输入密码的dialogInterface会出现两次
    肯定的啊
    onUserWakeUpEvent里,      mInflater01 = LayoutInflater.from(EX07_03.this);
            
            /* 建立解鎖密碼使用View的Layout */
            mView01 = mInflater01.inflate(R.layout.securescreen, null);//这个layout里肯定有mEditText01和mEditText02 了
            
            /* 於對話方塊中唯一的EditText等待輸入解鎖密碼 */
            mEditText02 = (EditText) mView01.findViewById(R.id.myEditText2);        
            /* 建立AlertDialog */
            new AlertDialog.Builder(this)
            .setView(mView01)//这里set了就会显示mView01整个view了,里面应该包括了那两个edit
            .setPositiveButton("OK",
            new DialogInterface.OnClickListener()
            //...
      

  2.   

    解决方法:将onUserWakeUpEvent里下面的代码移动到onCreate里,就不会出现两次dialog了。
    好像是因为在调用mView01的时候,因为存在于同一个方法中,所以导致该view出现两次???这么解释不大对,但是感觉上是这个思路。
    继续求教达人给出一个明确的解释。还得好好研究一下layoutInflater.inflate
        mInflater01 = LayoutInflater.from(EX07_03.this);
            
            /* 建立解鎖密碼使用View的Layout */
            mView01 = mInflater01.inflate(R.layout.securescreen, null);
            
            /* 於對話方塊中唯一的EditText等待輸入解鎖密碼 */
            mEditText02 = (EditText) mView01.findViewById(R.id.myEditText2);