2014-10-27 4 views
-1

Здесь я практикую несколько уроков создания сетки с автоматическим изменением размера изображения. Я принял это tutorial к своей деятельности. что я буду делать дальше, как сделать изображение кликабельным. так что, когда пользователи щелкают по каждому изображению, он переходит к некоторому классу/активности.Создание интерактивного изображения, чтобы открыть другое мероприятие

Вот несколько кода из программы я экспериментировал:

activity_main.xml бросить GridView в макет, режим простирания и ширина колонок:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 
<GridView 
    android:id="@+id/gridview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:verticalSpacing="5dp" 
    android:horizontalSpacing="5dp" 
    android:stretchMode="columnWidth" 
    android:numColumns="2" 
    /> 
</FrameLayout> 

MainActivity.java пользовательского ImageView который поддерживает его соотношение сторон:

public class MainActivity extends ImageView { 
public MainActivity(Context context) { 
    super(context); 
} 

public MainActivity(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public MainActivity(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); //Snap to width 
} 
} 

Это макет для элемента сетки:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<com.example.conversa.MainActivity 
    android:id="@+id/picture" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scaleType="centerCrop" 
    /> 
<TextView 
    android:id="@+id/text" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="10dp" 
    android:paddingRight="10dp" 
    android:paddingTop="15dp" 
    android:paddingBottom="15dp" 
    android:layout_gravity="bottom" 
    android:textColor="@android:color/white" 
    android:background="#55000000" 
    /> 

</FrameLayout> 

Это адаптер для GridView:

public class MyAdapter extends BaseAdapter { 
private List<Item> items = new ArrayList<Item>(); 
private LayoutInflater inflater; 

public MyAdapter(Context context) { 
    inflater = LayoutInflater.from(context); 

    items.add(new Item("Conversation 1",  R.drawable.pic1)); 
    items.add(new Item("Conversation 2", R.drawable.pic2)); 
    items.add(new Item("Conversation 3", R.drawable.pic3)); 
    items.add(new Item("Conversation 4",  R.drawable.pic4)); 
    items.add(new Item("Conversation 5",  R.drawable.pic5)); 
    items.add(new Item("Conversation 6",  R.drawable.pic6)); 
    items.add(new Item("Conversation 7",  R.drawable.pic7)); 
    items.add(new Item("Conversation 8",  R.drawable.pic8)); 
    items.add(new Item("Conversation 9",  R.drawable.pic9)); 
    items.add(new Item("Conversation 10",  R.drawable.pic10)); 
} 

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

@Override 
public Object getItem(int i) { 
    return items.get(i); 
} 

@Override 
public long getItemId(int i) { 
    return items.get(i).drawableId; 
} 

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    View v = view; 
    ImageView picture; 
    TextView name; 

    if(v == null) { 
     v = inflater.inflate(R.layout.gridimage, viewGroup, false); 
     v.setTag(R.id.picture, v.findViewById(R.id.picture)); 
     v.setTag(R.id.text, v.findViewById(R.id.text)); 
    } 

    picture = (ImageView)v.getTag(R.id.picture); 
    name = (TextView)v.getTag(R.id.text); 

    Item item = (Item)getItem(i); 

    picture.setImageResource(item.drawableId); 
    name.setText(item.name); 

    return v; 
} 

private class Item { 
    final String name; 
    final int drawableId; 

    Item(String name, int drawableId) { 
     this.name = name; 
     this.drawableId = drawableId; 
    } 
} 
} 

И это, когда адаптер устанавливается в GridView:

public class Gridpiw extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    GridView gridView = (GridView)findViewById(R.id.gridview); 
    gridView.setAdapter(new MyAdapter(this)); 
} 

} 

Что должен Я добавляю или могу изменить так, чтобы изображение можно было щелкнуть, чтобы показать новую активность?

ответ

1

Вы должны сделать это так:

Во-первых, создайте вас activity_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <GridView 
     android:id="@+id/gridview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:verticalSpacing="5dp" 
     android:horizontalSpacing="5dp" 
     android:stretchMode="columnWidth" 
     android:numColumns="2"/> 

</FrameLayout> 

Во-вторых, изменить Gridpiw к MainActivity имя класса:

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     GridView gridView = (GridView) findViewById(R.id.gridview); 
     gridView.setAdapter(new MyAdapter(this)); 
    } 
} 

В-третьих, изменить MainActivity расширяет ImageView к MeasuredImageView расширяет ImageView, как это:

public class MeasuredImageView extends ImageView { 
    public MeasuredImageView(Context context) { 
     super(context); 
    } 

    public MeasuredImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MeasuredImageView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); //Snap to width 
    } 
} 

Затем включите i т в макете элемента сетки:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

    <com.example.conversa.MeasuredImageView 
     android:id="@+id/picture" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true" 
     android:scaleType="centerCrop" 
    /> 
    <TextView 
     android:id="@+id/text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:paddingTop="15dp" 
     android:paddingBottom="15dp" 
     android:layout_gravity="bottom" 
     android:textColor="@android:color/white" 
     android:background="#55000000" 
    /> 

</FrameLayout> 

Примечание: ваш ImageView с идентификатором «картинка» должна иметь атрибут андроид: кликабельны = «истина».

Затем в вашем адаптере вы должны сохранить контекст, переданный как параметр.

public class MyAdapter extends BaseAdapter { 
    ... 
    private Context context 
    ... 
    public MyAdapter(Context context) { 
     this.context = context; 
     //your actions... 
    } 
} 

И, наконец, в вашем GetView() функции класса адаптера, вы должны setOnClickListener к вашему ImageView:

... 
@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    View v = view; 
    ImageView picture; 
    TextView name; 

    if(v == null) { 
     v = inflater.inflate(R.layout.gridimage, viewGroup, false); 
     v.setTag(R.id.picture, v.findViewById(R.id.picture)); 
     v.setTag(R.id.text, v.findViewById(R.id.text)); 
    } 

    picture = (ImageView)v.getTag(R.id.picture); 
    name = (TextView)v.getTag(R.id.text); 

    Item item = (Item)getItem(i); 

    picture.setImageResource(item.drawableId); 
    name.setText(item.name); 

    picture.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(context, SecondActivity.class); 
      context.startActivity(intent); 
     } 
    }); 

    return v; 
} 
... 

Надеется, что это помогает.

+0

спасибо за ответ, но как я могу заставить каждый элемент изображения иметь свою собственную активность. Я хочу, чтобы каждый элемент имел вид деятельности. например, изображение 3 переходит в ThirdActivity, изображение 4 переходит в FourthActivity и так далее. – Sororon

+0

Зачем вам так много занятий? – rom4ek

+0

Я пытаюсь сделать простое приложение для разговора, и у него есть 10 видов деятельности. когда вы нажимаете на каждый элемент, он переходит к активности, которая относится к элементу, который вы нажали. например, в пункте 1 речь идет о «введении» разговора, поэтому, когда вы нажимали на элемент, он вызывал действие с именем «Introduction.java». Пункт 2 посвящен разговору «просить о помощи», и когда вы щелкнули этот пункт, он переходит в «askhelp.java». И другие. как он может работать в коде ниже? – Sororon

0

Добавить этот вид Код для ImageViews на свой код внутри вашего адаптера Внутри GetView()

Добавить onClickListener()

picture.setOnClickListener(new OnClickListener() { 
     // Start new list activity 
     public void onClick(View v) { 
      Intent mainIntent = new Inten(SampleMainActivity.this,SecondActivity.class); 
      startActivity(mainIntent); 
     } 
} 
+0

Я реализую этот метод в своей программе, но я не мог сделать это для вызова более 1 активности с корпусом коммутатора. вы можете это объяснить? – Sororon

Смежные вопросы