ImageView具有视图ID但没有参数

时间:2015-01-08 13:53:28

标签: android android-layout android-fragments imageview

首先,我意识到这一事实,关于ImageViews有很多问题和答案,但我研究过这个网站还没有真正得到答案。事先我想为我出色的英语技能道歉,因为我不是在英国国家出生。

我的问题:我有一个应该显示/绘制给定图像的活动,我试图用片段来实现,因为我希望每次打开片段时都会将图像绘制得不同。此外,当Fragment位于前台时,我不想要任何UserInput。缩短了一小部分:图像弹出大约一秒钟并再次消失,用户无法控制图像显示的内容,时间,方式和位置。当我试图在onCreate中的片段中获取ImageView时(也尝试onResume,onActivityCreated ...)然后创建一个我绘制图像的Bitmap,问题就出现了。

Logcat没有给我任何错误,程序在“创建”位图时就死了。问题是,不知怎的,我得到了ImageView,但它没有高度,没有宽度,或者除了ID之外还有其他任何东西。

这是代码:

调用片段的活动:

package com.example.sehtestapp;


import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;


public class AnswerViewer extends ActionBarActivity
{


protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.answer_viewer);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) 
{

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}



@Override
public boolean onOptionsItemSelected(MenuItem item) 
{
    int id = item.getItemId();
    if (id == R.id.action_settings) {

        //This calls the Fragment
        ViewerFragment viewerFragment = new ViewerFragment();
        Bundle args = new Bundle();
        args.putInt("index", 200);
        viewerFragment.setArguments(args);
        getSupportFragmentManager().beginTransaction().add(R.id.answer_layout, viewerFragment).commit();

        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

然后我们有片段本身:

package com.example.sehtestapp;

import java.util.Random;

import android.support.v4.app.Fragment;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;

public class ViewerFragment extends Fragment{

   int size;
   View view;
   @Override
   public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState) {
       Bundle args = getArguments();
       size = args.getInt("index");
       /**
       * Inflate the layout for this fragment
       */
      view = inflater.inflate(R.layout.viewer_fragment, container, false);
      return view;
   }
   @Override
   public void onActivityCreated(Bundle savedInstances){
            Random r = new Random();
            short direction = (short) r.nextInt(9);
            ImageView iv = (ImageView) view.findViewById(R.id.SehtestViewer);
            Bitmap bitmap = Bitmap.createBitmap(iv.getWidth(), iv.getHeight(), Bitmap.Config.ARGB_8888);
//this line above breakes the Programm. the imageView gets and ID but no other params.

//here is just alot of drawing to which the Programm never gets
   }
}

这是viewer_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background = "#FFBB00"
android:id ="@+id/viewer_layout">
    <ImageView
    android:id="@+id/SehtestViewer"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:src="@drawable/abc_textfield_searchview_right_holo_dark" 
    android:contentDescription="@string/viewfield_of_sehtestring"/>

感谢所有回复和提前阅读,我希望得到一些快速回复:D

2 个答案:

答案 0 :(得分:1)

视图&#39;宽度和高度在实际渲染之前不会被设置(所以在onCreate中,你总是会有零宽度和高度)

您应该使用ViewTreeObserver:

ViewTreeObserver vtObserver = iv.getViewTreeObserver(); 
vtObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
{ 
    @Override 
    public void onGlobalLayout() 
    { 
        iv.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        int width  = iv.getMeasuredWidth();
        int height = iv.getMeasuredHeight(); 
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    } 
});

答案 1 :(得分:0)

answer_viewer.xml 中,添加如下布局。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background = "#FFBB00"
android:id ="@+id/fragment_container">

AnswerViewer.java 文件中,在公共布尔值onOptionsItemSelected(MenuItem item)函数中, 用这句话代替。

getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, viewerFragment).commit();

移动此声明

Bundle args = getArguments();

onActivityCreated()

希望这会对你有所帮助。