2015-11-06 110 views
1

我有一個片段在ViewPager我的活動,每一頁都有一個textview,我想了textview的文本從onCreate方法中包含viewpager活動而改變。我應該怎麼做呢?如何更改視圖ViewPager片段

下面

是,將返回一個空對象異常的代碼:

片段:

public class MyFragment extends Fragment { 

private TextView textView; 

public static MyFragment getInstance(){ 
    return new MyFragment(); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_layout, container, false); 

    textView = (TextView) rootView.findViewById(R.id.textView); 

    return rootView; 
} 

public void setText(String text){ 
    textView.setText(text); 
} 
} 

適配器:

public class ViewPagerAdapter extends FragmentPagerAdapter { 

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

@Override 
public Fragment getItem(int position) { 
    return MyFragment.getInstance(); 
} 

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

活動的onCreate:

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

    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    viewPager.setAdapter(adapter); 

    MyFragment fragment = (MyFragment) adapter.getItem(0); 
    fragment.setText("Altered");  // and this returns null pointer exception 
} 

謝謝你!

+0

因爲你的片段仍然沒有'attached',所以'onCreateView'仍不調用並且你的'TextView'爲空。有關更多信息,請參見[片段生命週期](https://dzone.com/articles/visualization-android-activity)。 – NamNH

+0

那麼我應該如何去改變文本或從主要活動中檢查textview的狀態? (也可以看看) – TPWang

+0

請試試這個[教程](https://guides.codepath.com/android/ViewPager-with-FragmentPagerAdapter) – NamNH

回答

1

大多數FragmentPagerAdapter旨意有一個addFragment方法,將讓那些通過內部對象添加到它的軌道不同的片段:

public class MyPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragments = new ArrayList<>(); 
    private final List<String> mFragmentTitles = new ArrayList<>(); 

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

    public void addFragment(Fragment fragment, String title) { 
     mFragments.add(fragment); 
     mFragmentTitles.add(title); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragments.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitles.get(position); 
    } 
} 

既然這樣,你的getItem實現返回MyFragment每一個新實例它被稱爲時間。因此,MyFragment fragment = (MyFragment) adapter.getItem(0);是一個永遠不會加載到ViewPager中的新實例,永遠不會被誇大,因此具有空值textView引用。

的另一個問題是,你的活動onCreate內,該片段尚未膨脹,所以,除非你耽誤呼叫的textView將是無效的:

final MyFragment fragment = (MyFragment) mPagerAdapter.getItem(0); 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     fragment.setText("Altered"); 
    } 
}, 100); 

不過說真的,爲什麼不設置它初始化時的正確值?

0

試試這個 片段:

public class MyFragment extends Fragment { 

private TextView textView; 
private String Text; 
public MyFragment (String Text){ 
    this.Text=Text; 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_layout, container, false); 

    textView = (TextView) rootView.findViewById(R.id.textView); 
    textView.setText(Text); 
    return rootView; 
} 

} 

適配器:

public class ViewPagerAdapter extends FragmentPagerAdapter { 

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

@Override 
    public Fragment getItem(int position) { 
    return new MyFragment("Altered"); 
} 

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

活動的onCreate:

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

    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    viewPager.setAdapter(adapter); 
}