2013-12-10 3 views
0

Я использую ViewPager для отображения 9 фрагментов. В каждом из этих фрагментов я хочу просто показать другую картину. Я хочу использовать один макет фрагмента, но динамически добавлять изображение. Кроме того, хотелось бы добавить кнопку «Продолжить» на последнем фрагменте, который при нажатии переходит к другому действию.Android: Использование ViewPager с несколькими динамическими фрагментами

Как мне сделать динамическое размещение фрагмента?

Основная деятельность

public class StoryboardPageActivity extends FragmentActivity { 
// The number of pages (wizard steps) to show in this demo. 
private static final int NUM_PAGES = 9; 

// 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_storyboard_page); 

    // Instantiate a ViewPager and a PagerAdapter. 
    mPager = (ViewPager) findViewById(R.id.storyboardPager); 
    mPagerAdapter = new StoryboardPagerAdapter(getSupportFragmentManager()); 
    mPager.setAdapter(mPagerAdapter); 
} 

@Override 
public void onBackPressed() { 
    if (mPager.getCurrentItem() == 0) { 
     // If the user is currently looking at the first step, allow the system to handle the 
     // Back button. This calls finish() on this activity and pops the back stack. 
     super.onBackPressed(); 
    } else { 
     // Otherwise, select the previous step. 
     mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
    } 
} 

// A simple pager adapter that represents 5 fragment objects, in sequence. 
private class StoryboardPagerAdapter extends FragmentStatePagerAdapter { 
    public StoryboardPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return StoryboardFragment.newInstance(position); 
    } 

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

Фрагмент

public class StoryboardFragment extends Fragment { 
private static final String KEY_POSITION = "position"; 

static StoryboardFragment newInstance(int position) { 
    StoryboardFragment frag = new StoryboardFragment(); 
    Bundle args = new Bundle(); 

    args.putInt(KEY_POSITION, position); 
    frag.setArguments(args); 

    return(frag); 
} 

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

    ImageView image = (ImageView)rootView.findViewById(R.id.imgStoryboard); 
    int position = getArguments().getInt(KEY_POSITION, -1); 

    int[] images = {R.drawable.storyboard1, R.drawable.storyboard2, R.drawable.storyboard3, 
        R.drawable.storyboard4, R.drawable.storyboard5, R.drawable.storyboard6, 
        R.drawable.storyboard7, R.drawable.storyboard8, R.drawable.storyboard9}; 

    image.setImageResource(images[position]); 

    return rootView; 
} 

} 

Фрагмент XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#fff" > 

<ImageView 
    android:id="@+id/imgStoryboard" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:contentDescription="@string/storyboardSlide" /> 

</RelativeLayout> 

ответ

2

Как мне сделать динамическое размещение фрагментов?

Точно так же вы производите любую другую «макетную динамику». Если вы хотите поместить изображение в ImageView, позвоните по телефону setImageBitmap() или setImageDrawable() или что угодно. Например, PagerAdapter может предоставить position фрагменту (по заводскому методу), и тогда фрагмент может узнать, какое изображение загрузить.

This sample project демонстрирует заселение hintEditText с пользовательским значением, основанным на position страницы.

Что касается кнопки «Продолжить», либо иметь отдельный класс фрагмент для этого (и соответствующие СМАРТС в вашем PagerAdapter, или всегда есть кнопка в макете, но устанавливается в android:visibility="gone" по умолчанию, переключая его с помощью setVisibility(View.VISIBLE) для фрагмент, который ему нужен.

+0

Я изменил свой код после просмотра вашего образца проекта, но когда я перехожу к активности, он не загружается правильно. Он не сбой, но он просто не загружает и не перезагружает Main Я обновил код выше. Можете ли вы дать мне указатель или два? –

+0

@ D-Rock: «он просто не загружает и не перезагружает основную деятельность» - я не знаю, что вы подразумеваете под этим, извините. Помимо создания 'images' будет' static final int [] ', я не вижу никаких очевидных проблем с тем, что у вас здесь. – CommonsWare

+0

это была проблема с тем, что изображения с высоким разрешением находились в обычной папке 'drawables' вместо папки' xhdpi'. Мне пришлось искать ошибку в LogCat. Спасибо, что указал мне в правильном направлении! –

Смежные вопросы