web-dev-qa-db-ja.com

nullオブジェクト参照のandroid.content.res.ResourcesAndroid.content.Context.getResources() '

SlidingTabLayoutにアイコンを表示しようとしているので、アダプターでこのようなものを作成しました。チュートリアルを探しているときに、getDrawableを使用する部分を編集しました。これは、すでに非推奨であり、私が見つけた解決策を適用する

    @Override
public CharSequence getPageTitle(int position) {

    Drawable image = ResourcesCompat.getDrawable(mContext.getResources(), icons[position], null);
    image.setBounds(0, 0, 48, 48);
    SpannableString sb = new SpannableString(" ");
    ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM);
    sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return sb;
}

また、アダプターでこれを宣言します。ここで、実際にドローアブルに配置して、すべてがそこにあるかどうかをすでに確認しています。

  private int[] icons = {
        R.drawable.tabone,
        R.drawable.tabtwo,
        R.drawable.tabthree,
        R.drawable.tapfour,
        R.drawable.tabfive
};

何を間違えたのかわかりませんが、常にこのエラーが発生します

Attempt to invoke virtual method 'Android.content.res.Resources Android.content.Context.getResources()' on a null object reference

画像を処理する変数を宣言しても。誰かが私を助けてくれますか?私の最小バージョンは14で、ターゲットSDKは22です。よろしくお願いします。

これが私のアダプターのコードです

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

CharSequence Titles[]; 
int NumbOfTabs;

Context mContext;

private int[] icons = {
        R.drawable.tabone,
        R.drawable.tabtwo,
        R.drawable.tabthree,
        R.drawable.tapfour,
        R.drawable.tabfive
};


public ViewPagerAdapter(FragmentManager fm,CharSequence mTitles[], int mNumbOfTabsumb, Context context) {
    super(fm);

    this.Titles = mTitles;
    this.NumbOfTabs = mNumbOfTabsumb;
    this.mContext = context;

}


@Override
public Fragment getItem(int position) {

    if(position == 0) // if the position is 0 we are returning the First tab
    {
        Tabone tab_one = new Tabone();
        return tab_one;
    }
    else if(position == 1)
    {
        Tabtwo tab_two = new Tabtwo();
        return tab_two;

    }else if(position == 2){
        Tabthree tab_three = new Tabthree();
        return tab_three;
    }else if(position == 3){
        Tabfour tab_four = new Tabfour();
        return tab_four;
    }else{
        Tabfive tab_five = new Tabfive();
        return tab_five;
    }

}


@Override
public CharSequence getPageTitle(int position) {

    Drawable image = ResourcesCompat.getDrawable(mContext.getResources(), icons[position], null);
    image.setBounds(0, 0, 48, 48);
    SpannableString sb = new SpannableString(" ");
    ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM);
    sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return sb;
}



// This method return the Number of tabs for the tabs Strip

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

}

これが私のMainActivityです

private ViewPager mPager;
private ViewPagerAdapter adapter;
private SlidingTabLayout mTabs;
private Context mContext;

 CharSequence Titles[] =   {"One", "Two", "Three", "Four", "Five"};

int Numboftabs = 5;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs, mContext);

    // Assigning ViewPager View and setting the adapter
    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(adapter);

    // Assigning the Sliding Tab Layout View
    mTabs = (SlidingTabLayout) findViewById(R.id.tabs);
    mTabs.setDistributeEvenly(true); 


    // Setting the ViewPager For the SlidingTabsLayout
    mTabs.setSelectedIndicatorColors(getResources().getColor(R.color.tabsIndicator));
    mTabs.setViewPager(mPager);
}
5
Kairi San

ここを参照してください:

adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs, mContext);

ここからmContextnullになります。 mContextメソッド内のonCreate変数に参照を割り当てなかったため。

次のように変更します。

adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs, MainActivity.this);

または、これを試すこともできます:

onCreateメソッド内:

mContext = MainActivity.this;

adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs, mContext);

ViewPagerAdapterのこのコードを使用してください:

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 

CharSequence Titles[]; 
int NumbOfTabs;

private Activity mContext;

private int[] icons = {
        R.drawable.tabone,
        R.drawable.tabtwo,
        R.drawable.tabthree,
        R.drawable.tapfour,
        R.drawable.tabfive
}; 


public ViewPagerAdapter(FragmentManager fm,CharSequence mTitles[], int mNumbOfTabsumb, Activity context) {
    super(fm); 

    this.Titles = mTitles;
    this.NumbOfTabs = mNumbOfTabsumb;
    this.mContext = context;

} 


@Override 
public Fragment getItem(int position) {

    if(position == 0) // if the position is 0 we are returning the First tab
    { 
        Tabone tab_one = new Tabone();
        return tab_one;
    } 
    else if(position == 1)
    { 
        Tabtwo tab_two = new Tabtwo();
        return tab_two;

    }else if(position == 2){
        Tabthree tab_three = new Tabthree();
        return tab_three;
    }else if(position == 3){
        Tabfour tab_four = new Tabfour();
        return tab_map; 
    }else{ 
        Tabfive tab_five = new Tabfive();
        return tab_five;
    } 

} 


    @Override 
public CharSequence getPageTitle(int position) {
    Drawable image = mContext.getResources().getDrawable(icons[position]);
    image.setBounds(0, 0, 48, 48);
    SpannableString sb = new SpannableString(" ");
    ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM);
    sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    return sb;
}





// This method return the Number of tabs for the tabs Strip 

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