2015-09-10 91 views
0

在我的MainActivity中,我有一個列表,當一個項目被點擊時,我進入了我的ScreenSlideActivity。這個活動將產生一個來自我稱爲ScreenSlidePageFragment的另一個類的片段,並且當我滑動時會爲我產生一些片段。我需要這些碎片中的內容是唯一的,具體取決於我選擇的列表中的哪個項目。不幸的是,我沒有在這方面取得成功。在設置片段中的動態內容時遇到問題

我已經嘗試在ScreenSlidePageFragment中創建一個set_all_data(string_data){}函數,並在創建片段之前調用它/更新textView,但我認爲我要麼獲得新文本的競爭條件,或者我只是做錯了,不夠好的理解碎片。


ScreenSlideActivity

package com.example.dgzl.corvegas; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.app.NavUtils; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.w3c.dom.Text; 

/** 
* Demonstrates a "screen-slide" animation using a {@link ViewPager}. Because {@link ViewPager} 
* automatically plays such an animation when calling {@link ViewPager#setCurrentItem(int)}, there 
* isn't any animation-specific code in this sample. 
* 
* <p>This sample shows a "next" button that advances the user to the next step in a wizard, 
* animating the current screen out (to the left) and the next screen in (from the right). The 
* reverse animation is played when the user presses the "previous" button.</p> 
* 
* @see ScreenSlidePageFragment 
*/ 
public class ScreenSlideActivity extends android.support.v4.app.FragmentActivity { 

    /* The number of pages (wizard steps) to show in this demo.*/ 
    private static final int NUM_PAGES = 3; 

    /* The pager widget, which handles animation and allows swiping horizontally to access previous 
    * and next wizard steps.*/ 
    private ViewPager mPager; 

    /* The pager adapter, which provides the pages to the view pager widget.*/ 
    private PagerAdapter mPagerAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_screen_slide); 

     // getting intent data 
     Intent in = getIntent(); 

     // Get JSON values from previous intent 
     final String biz_data[] = in.getStringArrayExtra("biz_data"); 


     set_fragment_data(biz_data); 

     // Instantiate a ViewPager and a PagerAdapter. 
     mPager = (ViewPager) findViewById(R.id.pager); 
     mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(mPagerAdapter); 
     mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       invalidateOptionsMenu(); 
      } 
     }); 
    } 

    public void onFragClick (View view){ 
     Toast.makeText(ScreenSlideActivity.this, "button", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     getMenuInflater().inflate(R.menu.activity_screen_slide, menu); 

     // enable 'prev' and 'next' when not on first node 
     menu.findItem(R.id.action_prev).setEnabled(mPager.getCurrentItem() > 0); 
     menu.findItem(R.id.action_next).setEnabled(mPager.getCurrentItem() < (NUM_PAGES-1)); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case 16908332: 
       // Navigate "up" the demo structure to the launchpad activity. 
       // See http://developer.android.com/design/patterns/navigation.html for more. 
       finish(); 
       return true; 
      case R.id.action_prev: 
       // Go to the previous step in the wizard. If there is no previous step, 
       // setCurrentItem will do nothing. 
       mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
       return true; 

      case R.id.action_next: 
       // Advance to the next step in the wizard. If there is no next step, setCurrentItem 
       // will do nothing. 
       mPager.setCurrentItem(mPager.getCurrentItem() + 1); 
       return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    /** 
    * A simple pager adapter that represents 5 {@link ScreenSlidePageFragment} objects, in 
    * sequence. 
    */ 
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 

     public ScreenSlidePagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      String test_data = "Soem data"; 
      ScreenSlidePageFragment newFrag = new ScreenSlidePageFragment(); 
      newFrag.set_all_data(test_data); 
      Fragment newFragment = newFrag.create(position); 
      return newFragment; 
     } 

     @Override 
     public int getCount() { 
      return NUM_PAGES; 
     } 
    } 

    public void set_fragment_data(String biz_data[]){ 
     // title as business name 
     setTitle(biz_data[1]); 
    } 
} 

ScreenSlidePageFragment

package com.example.dgzl.corvegas; 

import android.os.Bundle; 

import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

/** 
* A fragment representing a single step in a wizard. The fragment shows a dummy title indicating 
* the page number, along with some dummy text. 
* 
* <p>This class is used by the {@link } and {@link 
* ScreenSlideActivity} samples.</p> 
*/ 
public class ScreenSlidePageFragment extends android.support.v4.app.Fragment { 
    /** 
    * The argument key for the page number this fragment represents. 
    */ 
    public static final String ARG_PAGE = "page"; 

    /** 
    * The fragment's page number, which is set to the argument value for {@link #ARG_PAGE}. 
    */ 
    private int mPageNumber; 

    public String[] todays_data, biz_data, special_data; 
    public String all_data = "hardcoded and not good"; 

    /** 
    * Factory method for this fragment class. Constructs a new fragment for the given page number. 
    */ 
    public static ScreenSlidePageFragment create(int pageNumber) { 
     ScreenSlidePageFragment fragment = new ScreenSlidePageFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_PAGE, pageNumber); 
     fragment.setArguments(args); 
     Log.d("OnCreateView: ", "2"); 
     return fragment; 
    } 

    public ScreenSlidePageFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mPageNumber = getArguments().getInt(ARG_PAGE); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     ViewGroup rootView; 
     Log.d("OnCreateView: ", "1"); 
     TextView tv; 

     switch(getPageNumber()){ 
      case 0: 
       rootView = (ViewGroup) inflater.inflate(R.layout.fragment_today, container, false); 
       tv = (TextView)rootView.findViewById(R.id.today_frag_tv); 
       tv.setText(R.string.today_frag); 

       break; 
      case 1: 
       rootView = (ViewGroup) inflater.inflate(R.layout.fragment_business, container, false); 
       tv = (TextView)rootView.findViewById(R.id.biz_frag_tv); 
       tv.setText(all_data); 

       break; 
      case 2: 
       rootView = (ViewGroup) inflater.inflate(R.layout.fragment_specials, container, false); 
       tv = (TextView)rootView.findViewById(R.id.specials_frag_tv); 
       tv.setText(R.string.special_frag); 

       break; 
      default: 
       rootView = (ViewGroup) inflater.inflate(R.layout.fragment_today, container, false); 
       tv = (TextView)rootView.findViewById(R.id.today_frag_tv); 
       tv.setText(R.string.today_frag); 
     } 

     // Set the title view to show the page number. 
//  ((TextView) rootView.findViewById(android.R.id.text1)).setText(getString(R.string.title_template_step, mPageNumber + 1)); 

     return rootView; 
    } 


    /** 
    * Returns the page number represented by this fragment object. 
    */ 
    public int getPageNumber() { 
     return mPageNumber; 
    } 

    public void set_data(String[] todays_data, String[] biz_data, String[] special_data) { 
     this.todays_data = todays_data; 
     this.biz_data = biz_data; 
     this.special_data = special_data; 
    } 

    public void set_all_data(String all_data) { 
     this.all_data = all_data; 
    } 

    public void get_data() { 

    } 

} 

回答

1

的問題是在getItem()方法。您正在創建一個new ScreenSlidePageFragment,之後,您再次調用create()方法創建一個new ScreenSlidePageFragment。您需要靜態調用ScreenSlidePageFragment.create(position)

@Override 
public Fragment getItem(int position) { 
    String test_data = "Soem data"; 
    ScreenSlidePageFragment newFrag = ScreenSlidePageFragment.create(position); 
    newFrag.set_all_data(test_data); 
    return newFragment; 
} 
+0

除此之外,您應該提供「all_data」作爲參數 - 就像您對頁碼所做的一樣。這樣它將在配置更改中保留。 – kcoppock

相關問題