Nested Fragments (FragmentMyProfile.class 및 FragmentMyLibrary.class)가 포함 된 Fragment (FragmentMyAccount.class)를 만들기 위해 official documentation on how to implement swipe views with TabStrip instead of Tabs을 따라갔습니다. 이러한 중첩 된 부분은 childFragmentManager에 의해 관리되는 두 개의 탭에 해당합니다.정적 FragmentPagerAdapter에서 지역화 된 문자열에 액세스하는 방법
두 개의 탭과 astuetz's pagerSlidingTabStrip이 제대로 작동하지만 어댑터의 getPageTitle 메서드는 String 리소스에 액세스 할 수 없으며 각 탭 제목 (코드 하단 참조)에만 하드 코드 된 문자열을 반환 할 수 있습니다. 나는 XML 리소스에 액세스하려고 할 때 나타나는 컴파일시 에러가 읽 아래의 코드가 조정할 수없는 경우
는"FragmentMyAccount.this cannot be referenced from a static context"
는 대체 무엇을 구현 내 목표를 달성하기에 적합한 것입니까?
public static class MyAccountAdapter extends FragmentPagerAdapter
이 같은 생성자 MyAccountAdapter
(에 Context
를 전달하는 것입니다 해결하는 또 다른 방법
public class MyAccountAdapter extends FragmentPagerAdapter
과 : 귀하의 경우에는
package com.kouretinho.myapp;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.astuetz.PagerSlidingTabStrip;
public class FragmentMyAccount extends Fragment {
private static final int NUM_ITEMS = 2;
MyAccountAdapter mAdapter;
ViewPager mPager;
PagerSlidingTabStrip mTabStrip;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_my_account, container, false);
// Initialize the FragmentPager Adapter
mAdapter = new MyAccountAdapter(getChildFragmentManager());
// Initialize the ViewPager and set an adapter
mPager = (ViewPager) rootView.findViewById(R.id.viewpager_my_account);
mPager.setAdapter(mAdapter);
// Initialize the TabStrip and bind the tabs to the ViewPager
mTabStrip = (PagerSlidingTabStrip) rootView.findViewById(R.id.viewpager_tab_strip);
mTabStrip.setViewPager(mPager);
return rootView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
public static class MyAccountAdapter extends FragmentPagerAdapter{
private static final int MY_PROFILE = 0;
private static final int MY_LIBRARY = 1;
private static final String sExceptionMessage = "FragmentPagerAdapter was asked to getItem " +
"with position other than 0 or 1. This FragmentPagerAdapter can only return one of" +
"two Fragments at position 0 or 1.";
public MyAccountAdapter(FragmentManager fm){
super(fm);
}
@Override
public int getCount() {
return FragmentMyAccount.NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch (position){
case MY_PROFILE:
return new UserProfileFragment();
case MY_LIBRARY:
return new UserBooksFragment();
default:
throw new IllegalStateException(sExceptionMessage);
}
}
@Override
public CharSequence getPageTitle(int position) {
switch (position){
case MY_PROFILE:
// ********** THIS LINE IS PROBLEMATIC, cannot get Localised String resources
return FragmentMyAccount.this.getActivity().getResources().getString(R.id.my_profile);
case MY_LIBRARY:
return "my_library";
default:
return "no_title";
}
}
}
}
와우, 너무 간단하고 정확합니다! 정적 키워드를 제거하고 잘 작동했습니다. 여전히 문서가 "public static class"와 "plain"public class를 제안하는 이유는 무엇입니까? – kouretinho
아마도 부모 클래스의 인스턴스 메서드 나 필드에 액세스 할 필요가 없습니다. – Ayzen