【问题标题】:Button activity with viewPager?带有 viewPager 的按钮活动?
【发布时间】:2012-02-01 16:49:19
【问题描述】:

请不要评判我,我是 android 开发的新手……我想用 viewPager 制作一个应用程序……我有三个页面,三种不同的布局……但我就是做不到弄清楚如何处理 viewPager 上第二页上的按钮。我发现了这个问题“How to write button onClick method in viewpager?”并将我的代码设置为:

ViewPagerAdapter:

@Override
public Object instantiateItem( View pager, int position )
{
    View v = new View(pager.getContext());
    LayoutInflater inflater =
            (LayoutInflater) pager.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    int resId = 0;
    switch (position) {
    case 0:         
        resId = R.layout.deneme;            
        break;
    case 1:
        resId = R.layout.deneme2;          
        break;
    case 2:
        resId = R.layout.deneme3;
        break;   
    }

    v = inflater.inflate(resId, null);
    ((ViewPager) pager).addView(v, 0);

    return v;
  }

这里出现错误: “方法 findViewById(int) 未定义新 View.OnClickListener(){} 类型”

 LinearLayout l = (LinearLayout) findViewById(R.id.layout2); 

和“方法getResources() 未定义类型new View.OnClickListener(){}”上线

 l.setBackgroundDrawable(getResources().getDrawable(R.drawable.background));

主要:

 public class ViewPagerProjectActivity extends Activity {

 Button btn;
 View deneme2lout;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ViewPagerAdapter adapter = new ViewPagerAdapter( this );
    ViewPager pager = (ViewPager)findViewById( R.id.viewpager );
    pager.setAdapter( adapter );
    pager.setCurrentItem(0);


    LayoutInflater getView = getLayoutInflater();
    deneme2lout = (View) getView.inflate(R.layout.deneme2,null);      
    btn = (Button) deneme2lout.findViewById(R.id.button1);

}

public void buttonClick(View v) {
    if(v.equals(btn)) {
    deneme2lout.setBackgroundDrawable(getResources().getDrawable(R.drawable.background));
    }
}

 }

所以我得到了,我不能使用这两个代码......那么我应该怎么做呢?单击第二个布局上的按钮时,我需要更改第二页的背景。

这是我的 deneme2.xml 代码:

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="175dp"
        android:layout_height="95dp"
        android:layout_x="69dp"
        android:layout_y="174dp"
        android:textSize="25dp"
        android:text="Change" />

</AbsoluteLayout>

【问题讨论】:

  • 感谢您的代码帮助了我。
  • 很高兴听到它:) @Kedarnath

标签: android android-layout button android-viewpager


【解决方案1】:

这是因为,正如它所解释的,OnClickListener 没有您在 OnClickListener 中使用的这两种方法。替换:

LinearLayout l = (LinearLayout) findViewById(R.id.layout2);

LinearLayout l = (LinearLayout) v.findViewById(R.id.layout2);

如果它说 v 应该是最终的,那应该没问题。并替换:

getResources().getDrawable(R.drawable.background)

ViewPagerAdapter.this.context.getResources().getDrawable(R.drawable.background)

【讨论】:

  • 谢谢,它成功了 =) 但是现在,我在这一行得到了 NullPointerException:btn.setOnClickListener( ... );这可能是因为我与按钮不在同一个布局上......但无法弄清楚如何修复它......有什么建议吗?
  • 嗯,您仍在使用视图v,所以应该没问题...您确定该布局中存在 button1 和 layout2 吗?此外,您的代码当前实际上并未添加 View v 并将 OnClickListener 设置为页面,它添加了 View view。尝试更改它,以便在顶部情况下添加v,在底部两种情况下添加view,然后看看它是否有效。
  • 你是对的 :) 我已经进行了你提到的更改,现在它没有给出任何错误......但是点击它也没有改变背景:/ 还有什么应该我愿意? (很抱歉打扰了这么多,但正如我所说,我是 android 的新手)
  • 别担心!我现在不明白为什么它不起作用。您能否用您现在拥有的内容更新问题中的所有代码,然后发布您的 deneme.xml 文件(或任何包含 layout2 的文件)?
  • 嗯,这真的很奇怪,因为我仍然不明白为什么它不起作用。尝试将l.setBackgroundDrawable(ViewPagerAdapter.this.context.getResources().getDrawable(R.drawable.background)); 更改为l.setBackgroundResource(R.drawable.background);,它应该没有任何区别,但你永远不知道!
【解决方案2】:

至于你问题的第二部分,很简单!尽管您现在一直使用 View v,但您仍然在最后用新的通货膨胀“覆盖”它:

int resId = 0;
switch (position) {
case 0:         
    resId = R.layout.deneme;

    break;
case 1:
    resId = R.layout.deneme2;
    // Inflate v the first time
    v = inflater.inflate(R.layout.deneme2, null, false);
    @SuppressWarnings("deprecation")
    final AbsoluteLayout l = (AbsoluteLayout) v.findViewById(R.id.layout2);  
    // Add the OnClickListener to the button, which is associated with the above instance of v       
    btn = (Button) v.findViewById(R.id.button1);
    btn.setOnClickListener( new OnClickListener() {
        public void onClick(View m) {
            l.setBackgroundResource(R.drawable.background);
        }
    });
    break;
case 2:
    resId = R.layout.deneme3;
}

// Overwrite the instance of v with the OnClickListener with one without the OnClickListener
v = inflater.inflate(resId, null);
((ViewPager) pager).addView(v, 0);

return v;

因此,更改以下位应该可以使其完美运行:

  • View v = new View(pager.getContext()); 更改为View v = null;
  • 将最终膨胀(就在添加视图之前)更改为if (v == null) v = inflater.inflate(resId, null);

【讨论】:

  • 非常感谢!奇迹般有效! =)
  • 但是请问是否有办法处理主类中的按钮单击,而不是在 PagerAdapter 中?
【解决方案3】:

针对您最近的问题,您可以在适配器外部和活动内设置一个 onClick 侦听器,如下所示:

public void buttonClick(View v) {
    //do something

}

在包含按钮的 xml 中,确保将 android:onClick="buttonClick" 作为属性之一。

在包含按钮的 xml 中,确保将 android:onClick="buttonClick" 作为属性之一。

编辑 -- 我认为您没有应用我从您最近的代码中建议的更改...这是我的想法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ViewPagerAdapter adapter = new ViewPagerAdapter( this );
    ViewPager pager = (ViewPager)findViewById( R.id.viewpager );
    pager.setAdapter( adapter );
    pager.setCurrentItem(0);


    LayoutInflater getView = getLayoutInflater();
    deneme2lout = (View) getView.inflate(R.layout.deneme2,null);      

}

public void buttonClick(View v) {
    deneme2lout.setBackgroundDrawable(getResources().getDrawable(R.drawable.background));
}

如果不是这样,请让我们知道错误,以便我们引导您朝着正确的方向前进。

【讨论】:

  • 你能检查我的答案吗?我按照你所说的重新排序了我的代码......但仍然无法正常工作。
  • 我假设您仍然遇到问题,因为您在 if 语句中遇到 NullPointer 异常。您不需要在 buttonClick 方法中添加 if 语句来检查视图是否为 btn(这是多余的)。如果有人单击该按钮,则将调用 buttonClick 方法。正因为如此,我认为 deneme2lout.setBackgroundDrawable(R.drawable.background);应该没事。让我知道它是否有效。
  • 我试过了,但没有用...我编辑了我的代码,你可以在那里检查...提前谢谢!
  • 不,没有成功...它没有给出任何错误,但是 onclick 它不能正常工作。
猜你喜欢
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2012-09-23
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
相关资源
最近更新 更多