То, что у меня есть до сих пор, - это настраиваемая галерея, в которой я раздуваю макеты вместо изображений, чтобы создать пользовательский интерфейс, похожий на домашний экран Android.В моем приложении это представляет собой каталог описаний и изображений произведений искусства, которые пользователь может просматривать, проводя пальцем по экрану.
Поскольку галерея использует все наборы событий, я создал свой собственный подкласс класса галереи, чтобы позволить функциям прокрутки.Теперь я пытаюсь добавить функциональность к некоторым кнопкам в раздутых макетах.Я думаю, что здесь опять проблема в том, что галерея потребляет touchevents, потому что при установке .setOnClickListener на раздутый View в настроенном методе baseAdapters getView ничего не происходит.Я также попытался установить onClickListener непосредственно на кнопки в раздутых макетах после извлечения их с помощью onItemSelectedListener, но в результате возникает исключение нулевого указателя.
Вот код действия, в котором инициализирована галерея:
public class CatalogueActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.catalogue_gallery);
//initialize Gallery Widget
MyGallery g = (MyGallery) findViewById(R.id.gallery);
g.setAdapter(new ImageAdapter(this));
g.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
if(selectedItemView != null){
switch (position){
case 3:
//GoToMap Button in DetailView1
Button toMap_btn = (Button) selectedItemView.findViewById(R.id.GoToMap01);
toMap_btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent toCatalogue = new Intent().setClassName("com.uart", "com.uart.uartMain");
toCatalogue.putExtra("tabContent", 71);
startActivity(toCatalogue);
}
});
case 4:
//GoToMap Button in DetailView2
Button toMap_btn2 = (Button) selectedItemView.findViewById(R.id.GoToMap02);
toMap_btn2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent toCatalogue = new Intent().setClassName("com.uart", "com.uart.uartMain");
toCatalogue.putExtra("tabContent", 72);
startActivity(toCatalogue);
}
});
}
}
}
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
}
public class ImageAdapter extends BaseAdapter {
int mGalleryItemBackground;
private Context mContext;
private Integer[] mLayoutIds = {
R.layout.cover,
R.layout.catalogue_layout,
R.layout.introduction,
R.layout.artwork_detail,
R.layout.artwork_detail2,
R.layout.artwork_detail3,
R.layout.artwork_detail4
};
public ImageAdapter(Context c) {
mContext = c;
TypedArray a = obtainStyledAttributes(R.styleable.HelloGallery);
mGalleryItemBackground = a.getResourceId(
R.styleable.HelloGallery_android_galleryItemBackground, 0);
a.recycle();
}
public int getCount() {
return mLayoutIds.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(mContext).inflate(mLayoutIds[position], null);
convertView.setLayoutParams(new Gallery.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
convertView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent toCatalogue = new Intent().setClassName("com.uart", "com.uart.uartMain");
toCatalogue.putExtra("tabContent", 72);
startActivity(toCatalogue);
}
});
return convertView;
}
}
}
А вот мой подкласс галереи:
public class MyGallery extends Gallery {
FriendlyScrollView currScrollView;
boolean isSwiping = false;
public MyGallery(Context ctx, AttributeSet attrSet) {
super(ctx, attrSet);
// TODO Auto-generated constructor stub
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
currScrollView = getCurrScrollView();
return super.onInterceptTouchEvent(ev);
}
private boolean myGestureDetection(float distanceX){
if(distanceX >= 20 || distanceX <= -20){
Log.i("myGallery", "distanceX = "+distanceX);
isSwiping = true;
}
return isSwiping;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (myGestureDetection(distanceX) == false){
if(currScrollView != null){
currScrollView.scrollBy(0, (int) distanceY);
Log.i("myGallery", "Is scrolling vertical");
}
} else{
//Hier: Horizontal Scroll der Gallery Items
Log.i("myGallery", "Is scrolling horizontal");
}
return super.onScroll(e1, e2, distanceX, distanceY);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.i("myGallery", "is Swiping");
isSwiping = false;
// Calculate swipe-animation duration depending on gesture velocity
float velMax = 2500f;
float velMin = 1000f;
float velX = Math.abs(velocityX);
if (velX > velMax) {
velX = velMax;
} else if (velX < velMin) {
velX = velMin;
}
velX -= 600;
int k = 500000;
int speed = (int) Math.floor(1f / velX * k);
setAnimationDuration(speed);
return true;
}
private FriendlyScrollView getCurrScrollView() {
int pos = getFirstVisiblePosition();
if(pos != getAdapter().getCount()-1)
return (FriendlyScrollView)this.getSelectedView();
else
return null;
}
}
Вопрос теперь таков:мне снова нужно переопределить события касания галереи?Как бы я это сделал?И если это решение, как я могу определить различные функции для каждой кнопки в раздутых макетах (например, начать новое действие через намерение или перейти на другую «страницу» в каталоге)?