2014-03-01 5 views
0
@Override 
public Fragment getItem(int position) { 
    CharacterFragment fragment = new CharacterFragment(); 
    View rootView = fragment.getView(); 
    TextView character = (TextView) rootView.findViewById(R.id.character); 
    character.setText(name[position]); 
    return fragment; 
} 

이것은 ViewPager의 단편을 변경하는 코드입니다. 단편에는 텍스트보기가 하나만 있습니다. 기본적으로, 나는 내 이름으로 알파벳을 꿰뚫고있다. 따라서 인덱스에 따라 TextView 부분에 텍스트를 설정해야합니다.ViewPager에서 단편의 텍스트 변경

위의 코드를 사용하면 레이아웃이 아직 팽창되지 않았기 때문에 프로그램이 NullPointerException으로 불려서 추정합니다.

Fragment의 내용을 변경하는 올바른 방법은 무엇입니까? 그것이 표시되었다는 것을 알려주는 콜백 메소드가 있습니까?

답변

2

콜백이 없습니다. 텍스트를 만들 때 조각에 매개 변수로 텍스트를 보내고 조각 안에 텍스트를 설정할 수 있습니다. 같은

뭔가 :

@Override 
public Fragment getItem(int position) { 
    CharacterFragment fragment = CharacterFragment.newInstance(name[position]); 
    View rootView = fragment.getView(); 
    return fragment; 
} 

당신의 CharacterFragment.newInstance(String name) 방법과 같습니다

public static CharacterFragment.newInstance(String name) { 
    CharacterFragment fragment = new CharacterFragment(); 
    Bundle args = new Bundle(); 
    args.put("NAME_ARG", name); 
    fragment.setArguments(args); 
    return fragment; 
} 

다음에 onCreateView() 당신이 getArguments() 방법으로 인수를 얻을 당신이 키 NAME_ARG와 문자열을 얻을. 그리고 너는 그것을 가지고있다! 말이된다?

+0

문제 내부 'TextView'에 대한 참조는 항상 null로 되돌려집니다. 프래그먼트의'onResume()'에서'getView(). findViewById (R.id.myTextView)'를 사용해 보았지만 반환 값은 항상 null입니다. –

+0

자세한 내용을 제공하는 답을 편집했습니다. 아이디어는 조각을 만들 때 문자열을 매개 변수로 보낸 다음'onCreateView'에서 문자열에서 매개 변수를 가져 와서 TextView로 설정하는 것입니다. – gunar

+0

작동! 한 가지 간단한 질문 : 화면의 크기에 관계없이 각 문자가 화면을 채울 수 있도록 텍스트를 충분히 크게 만드는 방법은 무엇입니까? :) –

1

getView()을 사용하는 올바른 방법은 아닙니다. 당신이 원하는 것을 성취하는 방법은 조금 다릅니다. 이렇게하려면 문자열 (이 경우 name[position])을 메소드에 전달해야합니다. 그러나 대신 정적 메서드를 작성, 조각은 자신의 생성자를 인스턴스화되지 않는 것으로 기억한다, 나는 당신을 보여 드리죠 : 다음

@Override 
public Fragment getItem(int position) { 
    CharacterFragment fragment = CharacterFragment.newInstance(name[position]); 
    return fragment; 
} 

그리고를 CharacterFragment.java

public static CharacterFragment newInstance(String name) { 
    Bundle bundle = new Bundle(); 
    bundle.putString("key_name",name); 

    CharacterFragment fragment = new CharacterFragment(); 
    CharacterFragment.setsetArguments(bundle); 

    return fragment; 
} 

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

    View view = inflater.inflate(R.layout.fragment_xml_file, container, false); 

    // AND HERE WE GO 
    String name = getArguments().getString("key_name"); 
    TextView character= view.findViewById(R.id.character); 
    character.setText(name); 

    return view; 
} 
+0

* 프래그먼트가 생성자로 인스턴스화되지 않아야합니다. * Maryland University에서 제공하는 온라인 과정은'new'를 사용하여 제가하는 일을 보여줍니다 : O –

관련 문제