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 ; } } } } } |
コメントを投稿するにはログインしてください。