在Android教程应用程序中实现全屏显示图片的方法教程

7

使用“Hello, World Gridview”教程示例,我试图在点击时使图片全屏显示,而不是显示数组中图像的位置。由于我对Android不熟悉,这是我第一次尝试开发它,所以我感到很困惑。虽然我熟悉Java,但我已经尝试过像这样的事情(显然不起作用):

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this));

    gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
            showImage(v, position);
            Toast.makeText(HelloAndroid.this, "" + parent.getId(), Toast.LENGTH_SHORT).show();
        }
    });
}

private void showImage(View view, int position) {
    ImageView imgView = (ImageView) view; 
    imgView.setImageResource(position);     
}

但是应用程序崩溃了(强制关闭)。有任何想法吗?

这是我使用的教程应用程序


你得到了什么精确的错误信息?Logcat 说了些什么? - John
它在imgView.setImageResource处抛出了空指针异常。感谢您关于logcat的提示,我之前一直在使用常规调试器。至少现在我可以看到详细的错误信息:) 另外,view.getId()是-1。 - Organiccat
2个回答

23
imgView.setImageResource(position); 

这个错误是由于你的使用方法不正确。参数应该指向图像的资源ID(一个int类型),例如R.id.imageid。即使你提供了正确的资源ID,你想做的事情也不会生效。

要获得正确的资源ID,你需要调用视图的适配器并使用getItemId(position)方法来获取正确的资源ID。在你的ImageAdapter中,如果你将getItemId()方法更改为返回mThumbsIds[position]而不是0(如Google的示例中所示)。

然而,要实现你的目标,我建议你创建一个新的Activity并通过加载图片来达到目的。

例如:

gridview.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        long imageId = (ImageAdapter)parent.getAdapter.getItemAt(position);

        Intent fullScreenIntent = new Intent(v.getContext(), FullScreenImage.class);
        fullScreenIntent.putExtra(thisClassName.class.getName(), imageId);

        thisClassName.this.startActivity(fullScreenIntent);
    }
});

假设您创建了一个名为full_image.xml的布局文件,其中只包含一个带有 id 为 "fullImage" 的 ImageView,那么您的 FullScreenImage 类应该如下所示:

public class FullScreenImage extends Activity
{
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.full_image);
        Intent intent = getIntent();
        long imageId = intent.getExtras().get(thisClassName.class.getName());
        ImageView imageView = (ImageView) v.findViewById(R.id.fullImage);

        imageView.setLayoutParams( new ViewGroup.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT));

        imageView.setImageResource(imageId);
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    }
}

你需要进行一些微调,但类似于以下代码应该可以很好地为你工作。确保在AndroidManifest.xml文件中将FullScreenImage添加为一个<activity>


需要进行一些编辑,但一旦开始了,我就理解了大意。在着手学习Android之前,我可能应该从一些更简单的东西入手 :p - Organiccat
long imageId = (ImageAdapter)parent.getAdapter().getItemAt(position); -- 这行代码显示了类型不匹配:无法将 MainActivity.ImageAdapter 转换为 long。 - Md Mahbubur Rahman

0
在这里,您正在获取被点击的视图的ID(传递给view参数),并使用它再次查找自身:
ImageView imgView = (ImageView) findViewById(view.getId()); 

这毫无意义,特别是因为所点击的视图显然没有ID,导致findViewById返回null

您可能想传递您的ImageView的ID:

ImageView imgView = (ImageView) findViewById(R.id.whatever_the_id_of_the_image_view_is);

v是我的ImageView,我在调试器中仔细检查过了,它显示正常,但它没有mID(似乎是id,因为如果我尝试parent.getId(),它会显示出来)。这个ImageView是在代码内动态生成的对象,是GridView的数据组成部分,如果有帮助的话。 - Organiccat
我已经接近成功了,现在图像变成了空白,而且没有出现错误。 - Organiccat
由于imageView位于gridview内部,我是否需要替换gridview? - Organiccat
我已经更新了代码,以展示我正在做的更大部分内容。 - Organiccat
我猜你现在会得到一个ClassCastException,因为你给了我错误的信息。我已经回滚到我的先前答案,那个是正确的。如果它对你不起作用,请报告确切的异常和行号。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接