2017-03-27 6 views
1

를 실행FragmentManager 이미 내가보기 스크린 슬라이드의 슬라이더를 만들기 위해 구글 개발자 예제를 사용하는 거래를 안드로이드

모든 것은 내가 다음 조각으로 변경하는 온 클릭 리스너를 구현 한 순간에, 잘 작동했다

, 활동이 순간에, 잘 작동하고 나는 다시 BTN를 치거나 돌아가서 다른 답을 눌러 응용 프로그램을 보여줍니다

FragmentManager 이미 그것은 프로세스가 호출기에서 호출되고 있음을 보여줍니다 거래

를 실행 .java 및 fragments2.javaPager.java

public class Pager extends FragmentActivity { 

/*Number of Pages*/ 
private static final int NUM_PAGES = 5; 

private ViewPager mPager; 

private PagerAdapter mPagerAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_screen_slide); 
    Button prevBtn = (Button) findViewById(R.id.previous); 
    Button nextBtn = (Button) findViewById(R.id.next); 

    // Instantiate a ViewPager and a PagerAdapter. 
    mPager = (ViewPager) findViewById(R.id.pager); 
    mPager.setPageTransformer(true, new ThaTransformer()); 
    mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
    mPager.setAdapter(mPagerAdapter); 


    prevBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      prevItem(); 
     } 
    }); 
    nextBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      nextItem(); 
     } 
    }); 
} 


@Override 
public void onBackPressed(){ 

    if(mPager.getCurrentItem()==0){ 
     /*Prevent bug if user is on first step*/ 
     super.onBackPressed(); 
    }else{ 
     /*Previous item*/ 
     mPager.setCurrentItem(mPager.getCurrentItem()-1); 
    } 
} 
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter{ 
    public ScreenSlidePagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch(position) 
     { 
      case 0: return new SurveyFragment1(); 
      case 1: return new SurveyFragment2(); 
      case 2: return new SurveyFragment3(); 
      case 3: return new SurveyFragment4(); 
      case 4: return new SurveyFragment5(); 
      default : return new SurveyFragment1(); 
     } 
    } 

    @Override 
    public int getCount() { 
     return NUM_PAGES; 
    } 
} 
public boolean nextItem(){ 
    int nextItemVar = mPager.getCurrentItem(); 
    if(nextItemVar<=3){ 
     Log.d("Next XD", ""+mPager.getCurrentItem()); 
    }else{ 
     Log.d("Yay! XD", ""+mPager.getCurrentItem()); 
     new SweetAlertDialog(this, SweetAlertDialog.SUCCESS_TYPE) 
       .setTitleText("Encuesta enviada") 
       .setContentText("¡Gracias por llenar la encuesta!") 
       .show(); 
    } 
    mPager.setCurrentItem(nextItemVar + 1); 
    return true; 
} 
public boolean prevItem(){ 
    mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
    return true; 
} 

} 

검사 단편 1

public class SurveyFragment1 extends Fragment { 

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

    RadioGroup radioGroup = (RadioGroup) rootView.findViewById(R.id.ans_group1); 

    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
    { 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      //nextItem(); 

      ((Pager) getActivity()).nextItem(); 

      /**/ 

     } 
    }); 

    return rootView; 
} 

} 

검사 조각 2

,745

ThaTransfomer.java

package name of the package 

import android.support.v4.view.ViewPager; 
import android.view.View; 

public class ThaTransformer implements ViewPager.PageTransformer{ 
private static final float MIN_SCALE =0.85f; 
private static final float MIN_ALPHA = 0.5f; 

public void transformPage(View view, float position){ 
    int pageWidth = view.getWidth(); 
    int pageHeight = view.getHeight(); 
    if(position < -1){ 
     view.setAlpha(0); 
    }else if(position <=1){ 
     float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); 
     float vertMargin = pageHeight * (1 - scaleFactor)/2; 
     float horzMargin = pageWidth * (1 - scaleFactor)/2; 
     float ThaResult0 = horzMargin - vertMargin/2; 
     float ThaResultNon0 = horzMargin + vertMargin/2; 
     if(position < 0){ 
      view.setTranslationX(ThaResult0); 
     }else{ 
      view.setTranslationX(ThaResultNon0); 
     } 
     view.setScaleX(scaleFactor); 
     view.setScaleY(scaleFactor); 

     view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE)/(1 - MIN_SCALE) * (1 - MIN_ALPHA)); 
    }else{ 
     view.setAlpha(0); 
    } 
} 
} 

: 여기 샘플이다

public class SurveyFragment2 extends Fragment { 

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

    RadioGroup radioGroup = (RadioGroup) rootView.findViewById(R.id.ans_group2); 

    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
    { 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      //nextItem(); 
      ((Pager) getActivity()).nextItem(); 

     } 
    }); 

    return rootView; 
} 

} 

조사 조각 3

public class SurveyFragment3 extends Fragment { 

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

    RadioGroup radioGroup = (RadioGroup) rootView.findViewById(R.id.ans_group3); 

    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
     ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.pager); 
     public void onCheckedChanged(RadioGroup group, int checkedId) { 
      //nextItem(); 
      ((Pager) getActivity()).nextItem(); 

     } 
    }); 

    return rootView; 
} 
} 

그리고 나는 그것이 다시 슬쩍 경우이 오류는 다시 간다, 원하는 효과를 보여줍니다 처음에 대답하기 전에 말했듯이 목록에 계속적으로 간다

  1. 이미 대답 질문에 개의 다른 대답을
  2. BTN 뒷면을 히트 : 때 표시.
+0

수정? 동일한 문제가 있습니다 : setOnCheckedChangeListener 메서드에서 뭔가를하면 조각을 인스턴스화 할 때 동일한 오류가 발생합니다 – Tobliug

답변

0

드 블럭 (Trebliug)의 도움을 받아 마침내 트랜잭션이 발생했다는 것을 알았습니다. 즉, 트랜잭션의 오류와 같은 시간에 내 함수 nextItem이 트리거되고 있음을 알 수있었습니다. 이 오류를 arround 작동하기 위해

이 나는 ​​주요 활동 안에 공공 무효 기능을 만들고 다음 사용하여 XML 파일에서이 장소 :

android:onClick="FN" 

당신의 도움을 Tobliug 주셔서 감사합니다!

+0

문제 없음;). 이 스레드를 마치려면 Answers를 선택하십시오! – Tobliug

1

필자의 경우 수정/해킹이 발견되었습니다.

난 당신이 조각을 reCreate 때, OnCreateView는 null이 아닌 savedInstanceState와 함께 호출됩니다라고 생각합니다. 조각의 이전 인스턴스가 어딘가에 저장되었음을 의미합니다. 이 때문에 인스턴스 뭔가 코드에 깊은 발생하고 만들어 저장() (호출기를 getActivity()) nextItem() 조각 생성시 자동으로 호출합니다.

  1. 당신의 조각을 만들 수 있습니다 : OnCreateView 어디라고 setOnCheckedChangeListener 메소드를 설정했다.
  2. savedInstanceState가 이전 상태로 조각을 업데이트하려고합니다.
  3. 다른 라디오 그룹이 이전 값으로 설정되고 setOnCheckedChangeListener가 트리거됩니다.
  4. 귀하 ((호출기) getActivity()). nextItem(); 메서드가 호출되어 Exception을 생성합니다.

    @Override 
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) { 
        super.onViewStateRestored(savedInstanceState); 
    
        //hack to prevent the view to display previous selection 
        radioGroup .clearCheck(); 
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { 
         ViewPager viewPager = (ViewPager)  getActivity().findViewById(R.id.pager); 
         public void onCheckedChanged(RadioGroup group, int checkedId) { 
          //nextItem(); 
          ((Pager) getActivity()).nextItem(); 
    
         } 
        }); 
    } 
    

    그것이 도움이 될 것입니다 희망 : 그냥 상태가 복원 된 후 바로 라디오 버튼을 재설정하고 변경 리스너를 이동 - 여기

내 해킹입니다!

+0

어디에 배치해야합니까? radioGroup에서 변수 선언이 누락되었습니다. 벨로우즈를 배치하려고합니다. 그것은 오류를 보여줍니다, 나는 radioView.clearCheck() 안에 createView 배치하려고 노력하고 작동하지 않는, 그것은 여전히 ​​애플 리케이션을 충돌. 미리 감사드립니다! –