DialogでViewpager

DialogでViewpagerを使おうとした時のお話。

どうもAlertDialog.Builderを今まで使ってたのだが、とうとう不具合?が出てしまった。

今回DialogでViewpagerを使うために他のやつのように

// カスタムビューを設定
      LayoutInflater inflater = LayoutInflater.from(this);
      final View layout = inflater.inflate(R.layout.dialog_kusuri, (ViewGroup) findViewById(R.id.layout_root));

のDialogのlayoutからlayout.findViewById(R.id.pager)をViewPagerにしたのだが、何故かViewが見つからなくて落ちてしまう。(java.lang.IllegalStateException: Fragment does not have a view)

頑張ってpagerを見つけようとしたけどダメだった。

これは何でだろーってしらべた結果どうもAlertDialog.Builderを使ってるのが悪かったらしい

これからはDialogFragmentを使えとのこと。

ためしにDialogFragmentを使うとすんなり動いた。

PageDialog.java

package com.medicalmonitor;

import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;

public class PageDialog extends DialogFragment {
    private final static String KEY_URL = "diaog_key_urls";

    public static PageDialog newInstance(String[] urls) {
        PageDialog fragment = new PageDialog();
        Bundle args = new Bundle();
        args.putStringArray(KEY_URL, urls);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.dialog_kusuri, container, false);
        String[] urls = getArguments().getStringArray(KEY_URL);

        final ViewPager viewPager = (ViewPager) view.findViewById(R.id.pager2);
        final Dialog_Fragment_pager adapter = new Dialog_Fragment_pager(getChildFragmentManager());
        viewPager.setAdapter(adapter);

        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getDialog().setCanceledOnTouchOutside(true);

        return view;
    }
}

Dialog_Fragment_pager.java

package com.medicalmonitor;


import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;

import java.util.HashMap;
import java.util.Map;


public class Dialog_Fragment_pager
  extends FragmentPagerAdapter {//FragmentStatePagerAdapterはメモリ破棄する、保存するならこっち
   private Map<Integer, String> mFragmentTags;
    private FragmentManager mFragmentManager;
  public Dialog_Fragment_pager(FragmentManager fm) {
    super(fm);
    mFragmentManager = fm;
    mFragmentTags = new HashMap<Integer, String>();
  }
  private static final String ARG_SECTION_NUMBER = "section_number";

  @Override
  public Fragment getItem(int position) {
     return frag_dialog_pager_main.newInstance(position);
  }

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

  @Override
  public CharSequence getPageTitle(int position) {
     
    return "Page " + position;
  }
  @Override
  public Object instantiateItem(ViewGroup container, int position) {
      Object obj = super.instantiateItem(container, position);
      if (obj instanceof Fragment) {
          // record the fragment tag here.
          Fragment f = (Fragment) obj;
          String tag = f.getTag();
          mFragmentTags.put(position, tag);
      }
      return obj;
  }

  public Fragment getFragment(int position) {
      String tag = mFragmentTags.get(position);
      if (tag == null)
          return null;
      return mFragmentManager.findFragmentByTag(tag);
  }

}

frag_dialog_pager_main.java

package com.medicalmonitor;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.text.TextUtils;
import android.text.format.Time;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONObject;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class frag_dialog_pager_main extends Fragment {
   private static final String KEY_URL_STR = "urlStr";
   private static final int KANJANUM = 0;
   private static final int UNFINISHEDNUM = 1;
   private static final int FINISHEDNUM = 2;
   float juuryou=0;
   int mNum;//画面の番号1はunfinished2はfinishedとか
    final List<CustomData> localobjects = new ArrayList<CustomData>();//ローカルオブジェクト
   static frag_dialog_pager_main newInstance(int num) {
      frag_dialog_pager_main f = new frag_dialog_pager_main();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

    /**
     * When creating, retrieve this instance's number from its arguments.
     */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      mNum = getArguments() != null ? getArguments().getInt("num") : 1;
   }

   
    AlertDialog.Builder alertDlg2;
     private AlertDialog m_dlg;
      View rootView;
       ListView listView;
         //グローバル変数
          Globals globals;
         ArrayAdapter adapter;

            Fragment_pick pick = new Fragment_pick();
           // MainActivity activity = (MainActivity) getActivity();  
            MainActivity main = new MainActivity();
   @Override
   public View onCreateView(
      LayoutInflater inflater, 
      ViewGroup container, 
      Bundle savedInstanceState) {
      globals = (Globals) getActivity().getApplication();
      getActivity().getApplicationContext();

      return inflater.inflate(R.layout.frag_picking_finished, container, false);
   }
   @Override
    public void onStop() {
       //ImageCache.deleteAll(getCacheDir());
       super.onStop();
   
    }
   @Override
    public void onStart() {
       super.onStart();
       
   }
}

↑無駄な処理多いなー

ダイアログ使うときは

PageDialog newFragment = PageDialog.newInstance(null);
newFragment.show(getSupportFragmentManager(), TAG);

だけ!

まぁ動いてよかったー

↓弊社で開発、販売しているソフトウェアです↓

MediMonitor無料ダウンロード  

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です