2013-07-09 44 views
1

我的viewpager中有3個頁面。每個頁面都有一個最初設置爲開始按鈕的按鈕。按下開始按鈕後,它將變爲暫停按鈕。我的問題是,如果我在第一頁並單擊開始(將其更改爲暫停),然後滾動到最後一頁並返回到第一頁,則該按鈕表示再次開始。它失去了已經被按下的狀態。這隻發生在滾動TWO頁面之後。如果只滾動一頁然後返回,它不會丟失狀態。在ViewPager中滑動到新頁面會導致舊頁面丟失狀態

public Object instantiateItem(ViewGroup collection, int position) { 

     RelativeLayout wholeView = new RelativeLayout(collection.getContext()); 

      // images 
      final ImageView workoutWidget = new ImageView(collection.getContext()); 
      workoutWidget.setImageResource(R.drawable.workout_widget_master); 

      final ImageButton resetButton = new ImageButton(collection.getContext()); 
      resetButton.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.reset_button_master)); 
      RelativeLayout.LayoutParams resetButtonParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
      resetButtonParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
      resetButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
      resetButtonParams.height = 150; 
      resetButtonParams.width = 150; 
      resetButton.setLayoutParams(resetButtonParams); 
      resetButton.setVisibility(View.GONE); 

      final ImageButton startButton = new ImageButton(collection.getContext()); 
      startButton.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.start_button_master)); 
      startButton.setTag(context.getString(R.string.wtrStartButtonTag)); 
      RelativeLayout.LayoutParams startButtonParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
      startButtonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
      startButtonParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
      startButtonParams.height = 150; 
      startButtonParams.width = 150; 
      startButton.setLayoutParams(startButtonParams); 
      startButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        startButton.setAlpha(1.0f); 

        if (startButton.getTag() == context.getString(R.string.wtrStartButtonTag)) { 
         startButton.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.pause_button_master)); 
         startButton.setTag(context.getString(R.string.wtrPauseButtonTag)); 
         resetButton.setVisibility(View.VISIBLE); 
        } 
        else if (startButton.getTag() == context.getString(R.string.wtrPauseButtonTag)) { 
         startButton.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.start_button_master)); 
         startButton.setTag(context.getString(R.string.wtrStartButtonTag)); 
        } 
       } 
      }); 

      // text labels view 
      LinearLayout textLabels = new LinearLayout(collection.getContext()); 
      textLabels.setOrientation(LinearLayout.VERTICAL); 

       TextView activityDescription = new TextView(collection.getContext()); 
       activityDescription.setText("Warm-up"); 
       activityDescription.setPadding(200, 200, 0, 0); 
       activityDescription.setTextSize(30); 
       textLabels.addView(activityDescription); 

       TextView timeLeftForThisActivity = new TextView(collection.getContext()); 
       timeLeftForThisActivity.setText("00:00"); 
       timeLeftForThisActivity.setPadding(200, 0, 0, 0); 
       timeLeftForThisActivity.setTextSize(60); 
       textLabels.addView(timeLeftForThisActivity); 

       LinearLayout elapsedLabels = new LinearLayout(collection.getContext()); 
       elapsedLabels.setOrientation(LinearLayout.HORIZONTAL); 

        TextView elapsedTimeStatic = new TextView(collection.getContext()); 
        elapsedTimeStatic.setText("Elapsed Time: "); 
        elapsedTimeStatic.setPadding(200, 0, 0, 0); 
        elapsedTimeStatic.setTextSize(20); 

        TextView elapsedTimeDynamic = new TextView(collection.getContext()); 
        elapsedTimeDynamic.setText("00:00"); 
        elapsedTimeDynamic.setPadding(0, 0, 0, 0); 
        elapsedTimeDynamic.setTextSize(20); 

       elapsedLabels.addView(elapsedTimeStatic); 
       elapsedLabels.addView(elapsedTimeDynamic); 

      textLabels.addView(elapsedLabels); 

     // adding images and text to overall view 
     wholeView.addView(workoutWidget); 
     wholeView.addView(startButton); 
     wholeView.addView(resetButton); 
     wholeView.addView(textLabels); 

    collection.addView(wholeView, 0); 

    return wholeView; 
} 

回答

9

它失去了狀態,因爲viewpager默認只保存上一頁和下一頁(屏幕頁面限制爲1)。如果您滾動到最後一頁,則第一頁將被破壞。

您可以通過使用setOffscreenPageLimit(2);

+0

謝謝!我在這裏找到了另一個答案:http://stackoverflow.com/questions/8891968/android-viewpager-saving-data-and-views其中包含代碼示例 –

+0

答案正是我所說的大聲笑 – tyczj

1

Viewpager根據當前位置的工作增加保存在內存中的頁面數。考慮到許多選項卡或您的應用程序的片段,上一個和下一個位置都有當前位置。查看尋呼機只保留下一頁和上一頁的記憶。因此,您必須增加屏幕外頁面限制的數量以適應要刷屏的屏幕數量。你可以通過添加

viewPager.setOffscreenPageLimit(2); to your code. 

我希望這樣的作品。