0

У меня есть вкладка, на которой размещается viewpager (автогенерация с помощью мастера eclipse). Я слегка изменил только автоматически сгенерированный FragmentPagerAdapter, чтобы создать экземпляр определенного фрагмента на каждой вкладке. Первоначально у меня было 4 вкладки, 3 фрагмента для первых вкладок и по-прежнему автогенератор в последнем, и они работали. Когда я заменил последний экземпляр экземпляром одного из моих фрагментов, я столкнулся со следующей проблемой: фрагмент на одной из последних двух вкладок остается пустым:Один фрагмент внутри ViewPager не отображается

_____1st TAB ___ | ____ 2-я ТАБ_ | ___ 3-я ТАБ _____ | |

[MasterFragment] [RequestMap] [MasterFragment] [MasterFragment]

Это остается пустым _____________________ |

Кроме того, если я делаю «случайную» последовательность действий (меняйте вкладки, нажимайте на кнопки, чтобы выполнить некоторые действия, ...) фрагмент, который не отображает свопы, и становится последним, как следует :

_____1st TAB ___ | ____ 2-я ТАБ_ | ___ 3-я ТАБ _____ | ____ 4-я ТАБ ____ |

[MasterFragment] [RequestMap] [MasterFragment] [MasterFragment]

Это остается пустым __________________________________ |

Вот код для моего FragmentPagerAdapter:

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

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

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
     case REQUEST_TAB: 
      masterFragment = new MasterFragment(MasterFragment.ALL_REQUEST); 
      return masterFragment; 
     case MAP_TAB: 
      requestMap = new RequestMap(); 
      return requestMap; 
     case OWNER_TAB: 
      masterFragmentOwner = new MasterFragment(MasterFragment.OWNER_REQUEST); 
      System.out.println("I should have created the Owner MasterFragment"); 
      return masterFragmentOwner; 
     case JOINED_TAB: 
      masterFragmentJoined = new MasterFragment(MasterFragment.JOINED_REQUEST); 
      return masterFragmentJoined; 
     } 
     return null; 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (position) { 
     case REQUEST_TAB: 
      return getString(R.string.request_tab_title).toUpperCase(l); 
     case MAP_TAB: 
      return getString(R.string.map_tab_title).toUpperCase(l); 
     case OWNER_TAB: 
      return getString(R.string.owner_tab_title).toUpperCase(l); 
     case JOINED_TAB: 
      return getString(R.string.joined_tab_title).toUpperCase(l); 
     default: 
      return ""; 
     } 
    } 
} 

я опускаю код относительно установки на ViewPager, потому что одно и то же автогенерируемая от мастера затмения. Хотя вот код для класса MasterFragment:

package it.polimi.frontend.fragment; 

import it.polimi.appengine.entity.manager.model.Request; 
import it.polimi.appengine.entity.manager.model.User; 
import it.polimi.frontend.activity.R; 
import it.polimi.frontend.util.QueryManager; 
import it.polimi.frontend.util.QueryManager.OnRequestLoadedListener; 

import java.util.ArrayList; 
import java.util.List; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.view.InflateException; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class MasterFragment extends Fragment implements OnRequestLoadedListener, RequestList.OnRequestSelectedListener, RequestDetail.OnUserClickedListener{ 

private boolean twoPane; 
private static View view; 
public final static int ALL_REQUEST=0; 
public final static int OWNER_REQUEST=1; 
public final static int JOINED_REQUEST=2; 
private int mode; 

public MasterFragment(){ 
    this.mode=0; 
} 
public MasterFragment(int mode){ 
    this.mode=mode; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    QueryManager.getInstance().addListener(this); 
    if (view != null) { 
     ViewGroup parent = (ViewGroup) view.getParent(); 
     if (parent != null) 
      parent.removeView(view); 
    } 
    try { 
     view = inflater.inflate(R.layout.fragment_master,container, false); 
     List<Request> requests = new ArrayList<Request>(); 
     RequestList requestListFragment = null; 
     switch (mode) { 
     case OWNER_REQUEST: 
      requests = QueryManager.getInstance().getCurrentUser().getRequests(); 
      System.out.println("Dovrei aver recuperato le richieste dell'owner"); 
      break; 
     case JOINED_REQUEST: 
      String mail=null; 
      if (QueryManager.getInstance().getCurrentUser()!=null){ 
       User current =QueryManager.getInstance().getCurrentUser(); 
       mail = current.getPwAccount() != null ? 
         current.getPwAccount() 
         : current.getGmailAccount() != null ? 
           current.getGmailAccount() 
           : current.getFbAccount() != null ? 
             current.getFbAccount() 
             : null; 
       requests = QueryManager.getInstance().getUserPartecipation(mail); 
      } 
      else 
       requests = new ArrayList<Request>(); 
      break; 
     default: //ALL_REQUEST case and all the other possibilities 
      requests = QueryManager.getInstance().getRequests(); 
      break; 
     } 
     requestListFragment = new RequestList(requests, mode); 
     if (view.findViewById(R.id.detail_container) != null) {//TABLET CASE 
      twoPane = true; 
      getChildFragmentManager().beginTransaction() 
      .replace(R.id.request_list_container,requestListFragment,RequestList.ID) 
      .commit(); 

     } else { //PHONE CASE: 
      getChildFragmentManager().beginTransaction() 
      .replace(R.id.container,requestListFragment,RequestList.ID) 
      .commit(); 
     } 
    } catch (InflateException e) { 
     // is already there, just return view as it is 
     e.printStackTrace(); 
    } 
    return view; 
} 

@Override 
public void onRequestSelected(int position, Request request) { 
    if (twoPane) { 
     DetailContainerFragment detailContFrag = new DetailContainerFragment(request,mode); 
     getChildFragmentManager().beginTransaction() 
     .replace(R.id.detail_container, detailContFrag, DetailContainerFragment.ID).commit(); 
    } else { 
     switch (mode) {//This empty switch if for future changes 
     case OWNER_REQUEST: 
      break; 
     case JOINED_REQUEST: 
      break; 
     default://ALL_REQUEST    
      break; 
     } 
     RequestDetail fragment = new RequestDetail(request,mode); 
     Fragment reqList=getChildFragmentManager().findFragmentByTag(RequestList.ID); 

     getChildFragmentManager().beginTransaction() 
     .hide(reqList) 
     .addToBackStack(RequestDetail.ID) 
     .add(R.id.container,fragment,RequestDetail.ID) 
     .commit(); 
    } 
} 

@Override 
public void onUserClicked(User user,String requestId) { 
    if (!twoPane) { 
     FeedbackDetail fragment = new FeedbackDetail(user,this.mode,requestId); 
     Fragment reqDetail=getChildFragmentManager().findFragmentByTag(RequestDetail.ID); 

     getChildFragmentManager().beginTransaction() 
     .hide(reqDetail) 
     .addToBackStack(FeedbackDetail.ID) 
     .add(R.id.container,fragment,FeedbackDetail.ID) 
     .commit(); 

    } else { 
     /*DetailContainerFragment should take care of it*/ 
    } 
} 
@Override 
public void onRequestLoaded(List<Request> requests) { 
    System.out.println("Ho caricato: "+requests.size()); 
    RequestList requestListFragment = (RequestList)getChildFragmentManager().findFragmentByTag(RequestList.ID); 
    switch (mode) {//Also this switch is for future changes, but the requests list is anyway fetched and assigned to RequestList above 
    case OWNER_REQUEST: 
     //TODO 
     break; 
    case JOINED_REQUEST: 
     //TODO 
     break; 
    default: //ALL_REQUEST 
     if (requestListFragment!=null) 
      requestListFragment.setRequestAdapter(requests); 
     break; 
    } 
} 

} 

Если я что-то важное не хватает, пожалуйста, дайте мне знать. Спасибо всем заранее

EDIT: Я забыл сказать, что System.out, что я поместил шоу в консоли, так что «пустой» фрагмент должен быть создан, и он должен прошли через его onCreateView().

ответ

0

Я нашел ошибку. Проблема была

private static View view; 

из-за статических свойств. Снятие «статического» сработало снова. На самом деле я даже не могу объяснить, как он мог работать некоторое время на первой и последней вкладках, а не на третьем, потому что статические атрибуты должны быть разделены между всеми экземплярами класса. Из-за внутренних компонентов ViewPager проблема, казалось, обнаруживалась только на соседнем идентичном MasterFragment, если они чередуются с любым другим фрагментом, с которым он работал.

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