2014-10-27 77 views
-1

在这里,我将练习一些使用自动调整图片大小的GridView教程。我通过这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> 

其次,改变你的GridpiwMainActivity类名:

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扩展的ImageViewMeasuredImageView延伸的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 
    } 
} 

然后,包括我牛逼到您的电网项目布局:

<?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> 

注: ID为 “图片” 你的ImageView应该具有属性的android:点击= “真”。

然后在您的适配器中,您应该存储作为参数传递的上下文。

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 2014-10-29 15:51:33

+0

你为什么要这么多活动? – rom4ek 2014-10-29 17:13:29

+0

我正在尝试制作一个简单的对话应用程序,它有10个活动要显示。当您点击每个项目时,它将转到指向您点击的项目的活动。例如,第1项是关于“介绍”对话,所以当您单击该项时,它会调用名为“introduction.java”的活动。第2项是关于“寻求帮助”的对话,当你点击该项时,它会转到“askhelp.java”活动。其他人也是如此。它怎么可能在下面的代码中工作? – Sororon 2014-10-30 01:20:57

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

我在我的程序中实现了这个方法,但是我无法使用switch case调用多个活动。你能解释一下吗? – Sororon 2014-10-29 16:37:45