9

私はフラグメントについてたくさん読んできました。null が常に返されたため、フラグメントビューの取得に問題がある他の人を見つけましたが、私の問題は解決されませんでした。私がやろうとしているのは、画像ギャラリーを作成することです。画像ビューを保持するフラグメントがあります。フラグメントを表示するには、android.support.v4.view.ViewPager を使用します。を養うために、ViewPager私は を使用しandroid.support.v4.app.FragmentStatePagerAdapterます。

問題は、すべてがビルドされて画像が表示されたときに、現在表示されている画像をディスクに保存したいということです。したがって、現在のフラグメントのイメージビューを取得する必要がありますが、fragment.getView() は常に null であり、フラグメントに関連付けられているアクティビティも null であり、その理由がわかりません。誰かがここで助けてくれるかどうかを確認するためのコードを次に示します。

これは私のフラグメントです:

public class ImageViewURLFragment extends Fragment 
{
    String _url;

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, Bundle savedInstanceState) 
    {
        // The last two arguments ensure LayoutParams are inflated
        // properly.
        View rootView = new ImageViewURL(getActivity(), _url);

        return rootView;
    }

    public void setImageURL(String imgURL)
    {
        _url=imgURL;
    }
}

そして、これは私のアダプターです:

public class ImageViewURLCustomAdapter extends FragmentStatePagerAdapter 
{
    List<String> _urls=new ArrayList<String>();

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

    @Override
    public Fragment getItem(int i) 
    {
        ImageViewURLFragment fragment = new ImageViewURLFragment();
        fragment.setImageURL(_urls.get(i));

        return fragment;
    }

    public String getItemUrl(int i)
    {
        return _urls.get(i);
    }

    @Override
    public int getCount() {
        return _urls.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "OBJECT " + (position + 1);
    }

    public void addImageURL(String url)
    {
        _urls.add(url);
    }
}

これがメインのアクティビティです。get のコメントに注目してください。

public class MainActivity extends FragmentActivity 
{
    ImageViewURLCustomAdapter _iva=null;
    ViewPager _vp=null;

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

        _iva = new ImageViewURLCustomAdapter(
                        getSupportFragmentManager());
        _iva.addImageURL("http://upload.wikimedia.org/wikipedia/commons/b/b4/Saturn_(planet)_large.jpg");
        _iva.addImageURL("http://planetthreesixty.com/sites/default/files/planet.jpg");

        _vp = (ViewPager) findViewById(R.id.viewpager);
        _vp.setAdapter(_iva);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
    {
        if(item.getItemId()==R.id.saveToSD)
        {
            int index= _vp.getCurrentItem();
            Fragment fragment=_iva.getItem(index);

            //THis is where I need to get fragment view, but always returns null
                    View view= fragment.getView();
            ImageView iv=(ImageView)view.findViewWithTag("imageView");
            Bitmap bmp=iv.getDrawingCache();


        }


        return super.onOptionsItemSelected(item);
    }
}

長いソースで申し訳ありません。できる限りすべてをきれいにしましたが、すべての演奏部分を提示したかったのです。何が起こっているのか誰でも推測できますか?

前もって感謝します。

4

1 に答える 1

32

したがって、現在のフラグメントのイメージビューを取得する必要がありますが、fragment.getView() は常に null であり、フラグメントに関連付けられているアクティビティも null であり、その理由がわかりません。

これは、指定されたインデックスに対応するページに使用する_iva.getItem(index);を返すことを期待してFragmentいるためです。必要なフラグメントを取得するために既にメソッドを呼び出しており、メソッドを呼び出した後、新しいインスタンスを取得するため、ViewPagerこれは発生しません。この新しいインスタンスは( return )に関連付けられておらず、そのビューは作成されていません。ViewPagergetItemgetItemImageViewURLFragmentActivitygetActivity()null

FragmentStatePagerAdapter現在表示されている を取得するには、以下のコードを試してくださいFragment

if (item.getItemId()==R.id.saveToSD) {
     int index = _vp.getCurrentItem();
     Fragment fragment = _vp.getAdapter().instantiateItem(_vp, index);
     //...
于 2013-02-09T16:03:05.283 に答える