2014-02-28 110 views
0

我有一個spinner item.When我點擊位置2.我想執行下面的代碼。只顯示一個片段

if (pos == 2) { 
    Log.e("TEST", "YOU CLICKED" + pos); 
    for (int i = 0; i < 2; i++) { 
     Log.e("TEST INSIDE FOR", "YOU CLICKED" + pos); 
     if (i % 2 == 0) { 
      // showFragOne(); 
      showFragOne(); 
      Log.e("TEST INSIDE FOR " + i, "YOU CLICKED" + pos); 

      try { 

       Thread.sleep(20000); 

      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } else if (i %2 == 1) { 
      // showFragTwo(); 
      showFragTwo(); 
      Log.e("TEST INSIDE FOR " + i, "YOU CLICKED" + pos); 

      try { 
       Thread.sleep(20000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    Toast.makeText(mCoreContext,"One Fragment added from feature app",Toast.LENGTH_LONG).show(); 


} 

我想要這段代碼做的是改變20s的幀佈局。但只有我最後得到的第二個片段。這裏showFragTwo()功能: -

private void showFragTwo() { 
       // TODO Auto-generated method stub 
       FragmentTransaction ft = 
         .getFragmentManager().beginTransaction(); 
       if (fragtwo.isAdded()) { 
        if (fragtwo.isHidden()) 
         ft.show(fragtwo); 
        else 
         ft.hide(fragtwo); 

        ft.commit(); 
       } else { 
        ft.replace(com.example.coreapp.R.id.container, fragtwo, 
          "ADDFRAGTWO").commit(); 
        ft.show(fragtwo); 
       } 
      } 

這裏showFragOne()功能: -

private void showFragOne() { 
     // TODO Auto-generated method stub 
     FragmentTransaction ft = 
       .getFragmentManager().beginTransaction(); 

     if (frag.isAdded()) { 
      if (frag.isHidden()) 
       ft.show(frag); 
      else 
       ft.hide(frag); 

      ft.commit(); 
     } else { 

      ft.replace(com.example.coreapp.R.id.container, frag, "ADDFRAG") 
        .commit(); 
      ft.show(frag); 
     } 
    } 

其中i初始化在頂部FRAG和fragtwo下列到片段類: -

frag = new AddFragmentOne(); 
fragtwo = new AddFragmentTwo(); 

我得到以下爲logcat o/p。

**02-28 04:56:34.250: E/TEST INSIDE FOR: YOU CLICKED2 

02-28 04:56:34.290: E/TEST INSIDE FOR 0: YOU CLICKED2 

02-28 04:56:54.350: E/TEST INSIDE FOR: YOU CLICKED2 

02-28 04:56:54.350: E/TEST INSIDE FOR 1: YOU CLICKED2** 

我得到的O/P 但日誌消息爲何片段是沒有得到的信息?

只有第二個片段我正在

如果我評論第二,如果statemnt我得到第一個片段

誰能告訴我在哪裏,我收到了?

+0

我確實在showFragOne()和showFragTwo()中看不到commit()else –

+0

hey commit在if語句中的函數中都有。 –

+0

這是在UI線程上運行嗎? –

回答

2

發生這種情況是因爲您使線程睡眠了20秒,並且它可能是Ui線程。

if(pos == 2) { 
    showFragOne(); 
    new Timer().schedule(new TimerTask() { 

     @Override 
     public void run() { 
      showFragTwo(); 
     } 
    }, 20000); 
} 

要完成基於評論答案: 您應該由Timer顯示相應的片段替換此Thread.sleep()聲明,我建議你做一個方法

/** This method shows the fragment whose 'number' is {@code fragmentNumber}. */ 
public void showFrag(int fragmentNumber) { 
    Fragment f = fragments.get(fragmentNumber); // fragments can be a List for example 
    // Then use the code you already have to show fragment 'f' 
} 

然後,可以像這樣修改前面的代碼:

if(pos == 2) { 
    final AtomicInteger count = new AtomicInteger(0); // Because use inside TimerTask requires a final variable 
    new Timer().scheduleAtFixedRate(new TimerTask() { 

     @Override 
     public void run() { 
      if(count.get() < MAX_FRAG_INDEX) 
       showFrag(count.getAndIncrement); 
      else 
       cancel(); 
     } 
    }, 0, 2000); 
} 
+0

謝謝。其實你告訴我爲我工作。 –

+0

但是,我想要的是我想通過使用循環每2秒(任何小時間間隔)切換片段大約50次左右。對於2個或更多片段而言,類似於(i = 0; i <50; i ++)。 –

+0

在這裏,我只使用兩個片段,但我想使用一些更fragmnet切換基於我使用if值的其他值的片段視圖。我試過你的答案,它沒有爲我工作。 –