我正在尝试为飞盘高尔夫球杆制作应用程序。有了这个应用程序,我正在使用this tutorial制作gallery
swiper来查看不同的课程。但是在运行应用程序时,我在NullpointerException
方法中获得getView
。我无法理解为什么会这样。需要某人帮助指出错误。
这是例外:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setBackgroundResource(int)' on a null object reference
我的主要活动:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void OpenActivityBanen(View view) {
Intent visBane = new Intent(this,banen.class);
startActivity(visBane);
}
}
My SecondActivity :(我希望这个画廊swiper能够运行)
这是我在第NullPointerException
行getView
方法iv.setBackgroundResource(thumb[p]);
中获得public class banen extends MainActivity {
private GridView gv;
private Animator mCurrentAnimator;
private int mShortAnimationDuration;
private int j = 0;
private GestureDetector detector;
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private int thumb[] =
{
R.drawable.hull1, R.drawable.kartinfo , R.drawable.logo , R.drawable.logo1234, R.drawable.logo3 , R.drawable.logo4
};
private ImageView expandedImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.banen);
detector = new GestureDetector(this, new SwipeGestureDetector());
gv = (GridView) findViewById(R.id.grid_view);
gv.setAdapter(new ImageAdapter(this));
gv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int pos, long id) {
j = pos;
zoomImageFromThumb(v, thumb[pos]);
}
});
mShortAnimationDuration = getResources().getInteger(android.R.integer.config_shortAnimTime);
}
class ImageAdapter extends BaseAdapter
{
private LayoutInflater layoutInflater;
public ImageAdapter(banen activity)
{
layoutInflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return thumb.length;
}
@Override
public Object getItem(int pos) {
return pos;
}
@Override
public long getItemId(int pos) {
return pos;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
View listItem = convertView;
int p = pos;
if(listItem == null)
{
listItem= layoutInflater.inflate(R.layout.banen, null);
}
ImageView iv = (ImageView) listItem.findViewById(R.id.thumb);
iv.setBackgroundResource(thumb[p]);
return listItem;
}
}
private void zoomImageFromThumb(final View thumbView, int imageResId)
{
if(mCurrentAnimator != null){
mCurrentAnimator.cancel();
}
expandedImageView = (ImageView) findViewById(R.id.imageView2);
expandedImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (detector.onTouchEvent(event)) {
return true;
} else {
return false;
}
}
});
expandedImageView.setImageResource(imageResId);
final Rect startBounds = new Rect();
final Rect finalBounds = new Rect();
final Point globalOffset = new Point();
thumbView.getGlobalVisibleRect(startBounds);
findViewById(R.id.container).getGlobalVisibleRect(finalBounds,globalOffset);
startBounds.offset(-globalOffset.x, -globalOffset.y);
finalBounds.offset(-globalOffset.x, -globalOffset.y);
float startScale;
if((float) finalBounds.width() / finalBounds.height() > (float) startBounds
.width() / startBounds.height()){
startScale = (float) startBounds.height() / finalBounds.height();
float startWidth = startScale * finalBounds.width();
float deltaWidth = (startWidth - startBounds.width()) / 2;
startBounds.left -= deltaWidth;
startBounds.right+= deltaWidth;
}else{
startScale =(float) startBounds.width()/finalBounds.width();
float startHeight = startScale * finalBounds.height();
float deltaHeight = (startHeight = startBounds.height()) / 2;
startBounds.top -= deltaHeight;
startBounds.bottom += deltaHeight;
}
thumbView.setAlpha(0f);
expandedImageView.setVisibility(View.VISIBLE);
expandedImageView.setPivotX(0f);
expandedImageView.setPivotY(0f);
AnimatorSet set = new AnimatorSet();
set.play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left, finalBounds.left))
.with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top, finalBounds.top))
.with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, startScale, 1f))
.with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y, startScale, 1f));
set.setDuration(mShortAnimationDuration);
set.setInterpolator(new DecelerateInterpolator());
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
mCurrentAnimator = null;
}
@Override
public void onAnimationEnd(Animator animation) {
mCurrentAnimator = null;
}
});
set.start();
mCurrentAnimator = set;
final float startScaleFinal = startScale;
expandedImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mCurrentAnimator != null)
{
mCurrentAnimator.cancel();
}
AnimatorSet set = new AnimatorSet();
set.play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left))
.with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top))
.with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, startScaleFinal))
.with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y, startScaleFinal));
set.setDuration(mShortAnimationDuration);
set.setInterpolator(new DecelerateInterpolator());
set.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
thumbView.setAlpha(1f);
expandedImageView.setVisibility(View.GONE);
mCurrentAnimator = null;
}
@Override
public void onAnimationCancel(Animator animation) {
thumbView.setAlpha(1f);
expandedImageView.setVisibility(View.GONE);
mCurrentAnimator = null;
}
});
set.start();
mCurrentAnimator = set;
}
});
}
private class SwipeGestureDetector extends GestureDetector.SimpleOnGestureListener{
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try{
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
{
if(thumb.length >j){
j++;
if(j < thumb.length){
expandedImageView.setImageResource(thumb[j]);
return true;
} else {
j = 0;
expandedImageView.setImageResource(thumb[j]);
return true;
}
}
}else if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
if(j > 0){
j--;
expandedImageView.setImageResource(thumb[j]);
return true;
}else {
j = thumb.length - 1;
expandedImageView.setImageResource(thumb[j]);
return true;
}
}
}catch(Exception e){
e.printStackTrace();
}
return false;
}
}
@Override
public void onBackPressed() {
finish();
}
}
的地方
<?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"
android:id="@+id/container">
<GridView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/grid_view"
android:columnWidth="80dp"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp">
</GridView>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageView2"
android:visibility="invisible"
android:contentDescription="@string/app_name"/>
</FrameLayout>
Banen的XML:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/spillKnapp"
android:onClick="SpillMedNoen"
android:id="@+id/knapp1"
android:minWidth="300dp"
android:padding="20dp"
android:layout_above="@+id/baneKnapp1"
android:layout_centerHorizontal="true" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@drawable/logo4"
android:layout_alignParentStart="true"
android:layout_above="@+id/knapp1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/InfoKnapp"
android:onClick="ShowImage"
android:id="@+id/knapp2"
android:minWidth="300dp"
android:padding="20dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="23dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/baneKnapp"
android:id="@+id/baneKnapp1"
android:onClick="OpenActivityBanen"
android:minWidth="300dp"
android:padding="20dp"
android:layout_above="@+id/knapp2"
android:layout_centerHorizontal="true" />
</RelativeLayout>
主要活动的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:padding="5dp">
<ImageView
android:layout_width="72dp"
android:layout_height="72dp"
android:id="@+id/thumb"
android:layout_centerHorizontal="true"
android:contentDescription="@string/app_name"/>
</RelativeLayout>
Single_grid_item的XML :(这就是#34; Thumb&#34; ID已存储)
Process: com.hatlojohansen.veardiscgolf, PID: 19166
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setBackgroundResource(int)' on a null object reference
at com.hatlojohansen.veardiscgolf.banen$ImageAdapter.getView(banen.java:103)
at android.widget.AbsListView.obtainView(AbsListView.java:2347)
at android.widget.GridView.onMeasure(GridView.java:1060)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:444)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
at android.view.View.measure(View.java:17547)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:436)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615)
at android.view.View.measure(View.java:17547)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
我的LogCat:
Py_BuildValue()
答案 0 :(得分:0)
在方法getView()
中,您已经夸大了R.layout.Banen,然后调用了listItem.findViewById(R.id.thumb)
,但是在<{{}}中声明了带有 thumb 的XML元素1}}。我猜你可能想要膨胀R.layout.single_grid_item
而不是Banen。尝试更改以下内容:
R.layout.single_grid_item
到
listItem= layoutInflater.inflate(R.layout.banen, null);
答案 1 :(得分:0)
当您夸大商品的布局时:
$(document).ready(function(){
$(".delete_action").click(function(event){
$("#deletecategory").prop('href','/admin/category/'+ event.target.id +'/delete');
});
});
listItem = layoutInflater.inflate(R.layout.banen, null);
为空。因此,查找GridView
布局中的项目将返回Single_grid_item.xml
。
也许您打算使用null
ID代替imageView2
?
或许你夸大了错误的布局,而应该这样做:
thumb
答案 2 :(得分:0)
更改
listItem= layoutInflater.inflate(R.layout.banen, null);
到
listItem= layoutInflater.inflate(R.layout.Single_grid_item, null);
答案 3 :(得分:0)
listItem= layoutInflater.inflate(R.layout.banen, null);
您正在尝试将banen.xml
用于ListView项目。
在其中,您正在使用此行查找ID为thumbs
的ImageView:
ImageView iv = (ImageView) listItem.findViewById(R.id.thumb);
你可以在banen.xml
文件中看到自己没有这样的项目......因此你得到了例外。
我没有看过你指出的教程,但是他们要么为listItem
使用不同的布局,要么他们很可能在GridView
之间做了unselecting
的其他配置。通货膨胀以及他们搜索ImageView的那一刻。