首先,我意识到这一事实,关于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
答案 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()
希望这会对你有所帮助。