2013-04-03 40 views
2

我遇到了这个麻烦的android:滑动操作与按钮

package com.app.BoomBase; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Parcelable; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.RelativeLayout; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    MyPagerAdapter adapter = new MyPagerAdapter(); 
    ViewPager myPager = (ViewPager) findViewById(R.id.ViewPager); 
    myPager.setAdapter(adapter); 
    myPager.setCurrentItem(1);  

    } 

private class MyPagerAdapter extends PagerAdapter { 
    public int getCount() { 
     return 3; 
} 

public Object instantiateItem(View collection, int position) { 
    LayoutInflater inflater = (LayoutInflater) collection.getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     int resId =0; 
     switch (position) 
     { 
     case 0: 
       resId = R.layout.advanced; 
       break; 
     case 1: 
       resId = R.layout.activity_main; 
       break; 
     case 2: 
       resId = R.layout.beginner; 
       ImageButton ibDistance = (ImageButton)   findViewById(R.id.ibDistance); 
       RelativeLayout RelativeB = (RelativeLayout) findViewById(R.id.RelativeB); 
       break; 
     } 

     View view = inflater.inflate(resId, null); 

     ((ViewPager) collection).addView(view, 0); 

     return view; 
    } 
    @Override 
    public void destroyItem(View arg0, int arg1, Object arg2) { 
    ((ViewPager) arg0).removeView((View) arg2); 
    } 
    @Override 
     public boolean isViewFromObject(View arg0, Object arg1) { 
     return arg0 == ((View) arg1); 
    } 
    @Override 
     public Parcelable saveState() { 
     return null; 
     } 
} 
} 

我试图实现对所谓初学者的活动按钮,但如果我把一个OnClickListner的情况下,2名为ibDistance按钮,程序崩溃

ibDistance.setOnClickListener(new View.OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         //Open Activity here, via Intent 
        } 
       }); 

的logcat的文件:

E/AndroidRuntime(13680): FATAL EXCEPTION: main 
E/AndroidRuntime(13680): java.lang.NullPointerException 
E/AndroidRuntime(13680): at com.app.BoomBase.MainActivity$MyPagerAdapter.instantiateItem(MainActivity.java:52) 
E/AndroidRuntime(13680): at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110) 
E/AndroidRuntime(13680): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:800) 
E/AndroidRuntime(13680): at android.support.v4.view.ViewPager.populate(ViewPager.java:991) 
E/AndroidRuntime(13680): at android.support.v4.view.ViewPager.populate(ViewPager.java:880) 
E/AndroidRuntime(13680): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1374) 
E/AndroidRuntime(13680): at android.view.View.measure(View.java:15504) 
E/AndroidRuntime(13680): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) 
E/AndroidRuntime(13680): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1396) 
E/AndroidRuntime(13680): at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) 
E/AndroidRuntime(13680): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
E/AndroidRuntime(13680): at android.view.View.measure(View.java:15504) 
E/AndroidRuntime(13680): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) 
E/AndroidRuntime(13680): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
E/AndroidRuntime(13680): at android.view.View.measure(View.java:15504) 
E/AndroidRuntime(13680): at android.widget.LinearLayout.measureVertical(LinearLayout.java:833) 
E/AndroidRuntime(13680): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
E/AndroidRuntime(13680): at android.view.View.measure(View.java:15504) 
E/AndroidRuntime(13680): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5059) 
E/AndroidRuntime(13680): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
E/AndroidRuntime(13680): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2385) 
E/AndroidRuntime(13680): at android.view.View.measure(View.java:15504) 
E/AndroidRuntime(13680): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1979) 
E/AndroidRuntime(13680): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1222) 
E/AndroidRuntime(13680): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1395) 
E/AndroidRuntime(13680): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1115) 
E/AndroidRuntime(13680): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4526) 
E/AndroidRuntime(13680): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
E/AndroidRuntime(13680): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
E/AndroidRuntime(13680): at android.view.Choreographer.doFrame(Choreographer.java:525) 
E/AndroidRuntime(13680): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
E/AndroidRuntime(13680): at android.os.Handler.handleCallback(Handler.java:615) 
E/AndroidRuntime(13680): at android.os.Handler.dispatchMessage(Handler.java:92) 
E/AndroidRuntime(13680): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(13680): at android.app.ActivityThread.main(ActivityThread.java:4921) 
E/AndroidRuntime(13680): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(13680): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(13680): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
E/AndroidRuntime(13680): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
E/AndroidRuntime(13680): at dalvik.system.NativeStart.main(Native Method) 

我能做些什么? 谢谢:)

+0

你在哪里添加了'ibDistance.setOnClickListener'?你可以发布你的logcat吗? – AwadKab

回答

2

一个问题我要问第一个 - 是按钮,您尝试使用您的主要活动的一部分? findViewById通过搜索您在setContentView中提供的视图来查找您正在查找的视图 - 在本例中为按钮。如果按钮实际上不在布局中,那么它将不会被发现,并会给你一个错误。

假设按钮在主活动布局这里是我想是怎么回事。

通常你需要你的onCreate方法中添加onClickListener。有一些方法可以将onClickListener移动到onCreate以外,例如using a private class。我想你可以解决这个问题有以下几点:

(1)前宣布你为一个实例变量按钮,您onCreate

ImageButton ibDistance; 

(2)你的onCreate方法

内初始化您的按钮,并设置 onClickListener
ibDistance = (ImageButton) findViewById(R.id.ibDistance); 
ibDistance.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
       } 
      }); 

如果你在2的情况下布局变更或添加按钮(我不能告诉你在做什么,真的),那么你就只指您在早些时候宣布的ImageButton代码部分。

另一种方式来做到这一点是不使用的onClickListener可言。按钮都具有onClick XML属性,该属性允许您指定触发的方法,而不必使用onClickListener。要使用这个函数,你需要在你希望按钮触发某个事件的活动中声明一个公共方法。

public void runThisOnClick(View v){ 
    //do something 
} 

评论部分的内容是当您按下按钮时会发生什么。很明显,您可以更改该方法的名称以及您在该按钮的onClick属性中放置的内容以适合您的需求。

+0

该按钮位于初学者的视图..这就是为什么我试图把OnClickListner在案例2中。 – Lasse

+0

如果您将OnClik放入此案例中(case2)它说“void”是无效类型对于变量.. – Lasse

+0

正确 - 它是无效的,因为findViewById查看你提供的视图,而不是初学者的视图。初学者是单独的活动吗?新的布局?它如何在应用程序中运行? – Rarw