xmlを使わずにFragmentを生成する方法をぐぐっていて、ヒットした
android - How to programmatically create the layout for a Fragment?
android - How do I add a Fragment to an Activity with a programmatically created content view
を参考にコードをでっち上げたが、果たしてこれで正しいのかどうかよくわからないw
そもそもなんでそんなことをしようしたのかというと、前のエントリを確認している時に
LongClickを拾えなくなった時に「前に試したコードはListFragmentだったから、それと
一緒にしないと再現できないのか…( ;・´ω・`)ゴクリッ?」という勘違いをして、かつ、
「サンプルコードはワンストップならぬワンコピペで完結すべき(`・ω・´)」という
謎の思想から、xmlファイルによるレイアウト指定を無しにしたいと思ったから(ノ∀`)
一応これで出来てるみたいだけれども、実際にプログラムの一部として使うには
もっと何かをしないといけないのかもしれないが、その辺はよくわからないw
取り敢えずワンコピペで試せるFragmentを使用するサンプルを作るのには
利用出来るので、これはこれでいいかな。
なぜかLongClickでToastが表示出来ないのは謎(´・ω・`)
Log.dには出力されているのに。まあタッチイベント関連はこのサンプルの
本質とは全く関係ないのだけれどw
import android.app.Activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity { private GestureDetector mGestureDetector; private View.OnTouchListener mGestureListener; private static final int CONTENT_VIEW_ID = 10101010; private static final String[] CONFECTIONERY = { "Apple Pie", "Banana Bread", "Cupcake", "Donut", "Eclair", "Froyo", "Gingerbread", "Honeycomb", "Ice Cream Sandwich", "Jelly Bean", "KitKat", "Lollipop" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout=new LinearLayout(this); layout.setBackgroundColor(Color.WHITE); layout.setOrientation(LinearLayout.VERTICAL); layout.setId(CONTENT_VIEW_ID); setContentView(layout, new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); Bundle bundle = new Bundle(); bundle.putStringArray("confectionery", CONFECTIONERY); if (savedInstanceState == null) { Fragment newFragment = new MyFragment(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(CONTENT_VIEW_ID, newFragment).commit(); } } private void myOnItemClick(int position) { Log.d("myOnItemClick", "itemClick: " + position); Toast.makeText(MainActivity.this, "myOnItemClick itemClick" + position, Toast.LENGTH_LONG).show(); } public class MyFragment extends Fragment { public MyFragment() {} View rootView; ListView listView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LinearLayout layout=new LinearLayout(getActivity()); Log.d("MyFragment", "onCreateView"); layout.setOrientation(LinearLayout.VERTICAL); listView = new ListView(getActivity()); listView.setLayoutParams(new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); listView.setAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, CONFECTIONERY)); layout.addView(listView); rootView = layout; rootView.setBackgroundColor(Color.WHITE); return rootView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mGestureDetector = new GestureDetector(getActivity(),new MyGestureDetector()); mGestureListener = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return mGestureDetector.onTouchEvent(event); } }; listView.setOnTouchListener(mGestureListener); listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Log.d("onItemLongClick", "LongClick"); Toast.makeText(MainActivity.this, "onItemLongClick LongClick", Toast.LENGTH_LONG).show(); return true; } }); } class MyGestureDetector extends SimpleOnGestureListener { private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_MAX_OFF_PATH = 250; private static final int SWIPE_THRESHOLD_VELOCITY = 200; @Override public boolean onSingleTapUp(MotionEvent e) { int pos = listView.pointToPosition((int)e.getX(), (int)e.getY()); myOnItemClick(pos); return false; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { return false; } boolean isDoCancel = false; if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.d("onFling", "FlingLeft"); Toast.makeText(MainActivity.this, "onFling FlingLeft", Toast.LENGTH_LONG).show(); isDoCancel = true; } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.d("onFling", "FlingRight"); Toast.makeText(MainActivity.this, "onFling FlingRight", Toast.LENGTH_LONG).show(); isDoCancel = true; } if(isDoCancel){ MotionEvent cancelEvent = MotionEvent.obtain(e2); cancelEvent.setAction(MotionEvent.ACTION_UP); listView.onTouchEvent(cancelEvent); return true; }else{ return false; } } } } }