2014-02-28 112 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值的其他值的片段视图。我试过你的答案,它没有为我工作。 –