2013-12-09 43 views
0

您好我正在使用本教程http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging制作一个ViewPager应用程序,此处使用的ViewPager很酷的一点是每个页面都有基于xml的不同布局。问题是我尝试了不同的方法来使我在布局中创建的按钮能够工作,但我无法找到放置onClick监听器的地方。下面是该ViewPager适配器:在视图寻呼机中实现监听器

class UniversePagerAdapter extends PagerAdapter { 

protected static final String[] CONTENT = new String[] { "One", "Two", "Three", "Four", }; 

public int getCount() { 
    return 4; 
} 

Dashboard activity; 
public UniversePagerAdapter(Dashboard activity){ 
    this.activity = activity; 
} 

public Object instantiateItem(final View collection, int position) { 
    LayoutInflater inflater = (LayoutInflater) collection.getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    int resId = 0; 
    switch (position) { 
    case 0: 
     resId = R.layout.one; 
     break; 
    case 1: 
     resId = R.layout.two; 
     break; 
    case 2: 
     resId = R.layout.three; 
     break; 
    case 3: 
     resId = R.layout.four; 
     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; 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    return UniversePagerAdapter.CONTENT[position % CONTENT.length]; 
} 
} 

这里的地方它绑定部分:

public class Dashboard extends BaseActivity implements OnClickListener { 

Button bNewButton; 

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

    setAdapter(); 

} 

public void initPagerView(int position, View view) { 

    bNewButton = (Button) view.findViewById(R.id.bNewUniverse); 
    bNewButton.setOnClickListener(this); 

} 

private void setAdapter() { 
    // TODO Auto-generated method stub 
    mAdapter = new UniversePagerAdapter(Dashboard.this); 

    mPager = (ViewPager) findViewById(R.id.pager); 
    mPager.setAdapter(mAdapter); 
    mPager.setCurrentItem(1); 

    mIndicator = (TitlePageIndicator) findViewById(R.id.indicator); 
    mIndicator.setViewPager(mPager); 
}     

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Toast.makeText(getApplicationContext(), "It Lives!!!!", 
      Toast.LENGTH_LONG).show(); 
} 
} 

我正在初始化,并使用在XML布局创建的对象,因为他们都在的问题适配器。 请帮我一下吗?

+0

测试答案,并会尽快给出反馈:-) –

回答

2

你可以有功能的活动称为initPagerView如下:

public void initPagerView(int position,View view){ 
    //Here you can use view.findViewById(); 
} 

而且在适配器:

private class MyPagerAdapter extends PagerAdapter { 
    public int getCount() { 
     return 5; 
    } 
    <YourActivityClass> activity; 
    public MyPagerAdapter(<YourActivityClass> activity){ 
     this.activity=activity; 
    } 
    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.farleft; 
      break; 
     case 1: 
      resId = R.layout.left; 
      break; 
     case 2: 
      resId = R.layout.middle; 
      break; 
     case 3: 
      resId = R.layout.right; 
      break; 
     case 4: 
      resId = R.layout.farright; 
      break; 
     } 
     View view = inflater.inflate(resId, null); 
     ((ViewPager) collection).addView(view, 0); 
     activity.initPagerView(position,view); 
     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; 
    } 
} 

这是做这件事。 现在在initPagerView(int position,View view)这是你的活动中,你可以初始化你的视图,这是从适配器添加到视图寻呼机中。

您还可以创建一个Interface像:

public Interface PagerViewInitialiser{ 
    public initPagerView(int position,View view); 
} 

,让您的活动实现这一点。

而在你的寻呼机适配器:

PagerViewInitialiser activity; 
public MyPagerAdapter(PagerViewInitialiser activity){ 
    this.activity=activity; 
} 
+0

嗨,对不起,花了很长时间。我已经添加了初始化视图的方法,但没有发生点击事件。我已经更新了代码以使用init ...需要帮助 –

+0

您需要调用活动。initPagerView(位置,视图);这在instantiateItem只是在你返回一个视图 –

+0

我调用了init的pagerView,但得到一个空指针异常,当我添加一个监听器到一个按钮 –

0

如果你在你的布局按钮,在instantiateItem膨胀的观点后,您可以在视图 通话findViewById你只是膨胀来获得你的按钮。喜欢的东西:

Button btn = (Button) view.findViewById(R.id.yourBtn); 
btn.setOnClickListener(new OnClickListener() { 
      }); 
+0

将无法​​正常工作....已经尝试 –

0

一个办法是:

做延伸的ViewGroup(RelativeLayout的,LinearLayout中......)对每个自定义页面自定义视图。 通上下文类扩展查看

public class TestView extends RelativeLayout{ 


public enum Action{ 
    ACTION_TEST_BTN, 
    ACTION_SOMETHING_ELSE 
} 

public interface MyTestViewActionListener{ 
     public void onAction(Action myAction); 
} 


private MyTestViewActionListener listener; 

public TestView(Context context) { 
    super(context); 
    LayoutInflater mInflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mInflater.inflate(R.layout.left, this, true); 
    } 
public void setListener(MyTestViewActionListener listener){ 

    this.listener = listener;  

    Button btnTest = (Button)findViewById(this,R.id.btnTest); 
    btnTest.setOnClickListener(
       new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
               listener.onAction(Action.ACTION_TEST_BTN); 

        } 
       }); 
} 
. 
. 
. 
} 

接下来,您可以在您的PageAdapter:

TestView testV = new TestView(activity); 
testV.setListener(listener); 

定义构造函数,像这样一个

public MyPagerAdapter(<YourActivityClass> activity, MyTestViewActionListener listener){ 
     this.activity = activity; 
     this.listener = listener; 
    } 

在最后你可以在你的activity/fragment工具界面MyTestViewActionListener和 的实现方法:

onAction(Action action) 
{ 
    switch(action) 
    case(Action.ACTION_TEST_BTN): 
    //do something 
    break; 
    . 
    . 
} 
+0

我在哪里放置TestView testV = new TestView(activity); \t testV.setListener(listener); ...它目前在适配器中..但当我点击但没有任何反应 –