请不要评判我,我在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()未定义新类型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>
答案 0 :(得分:2)
这是因为,正如它解释的那样,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)
答案 1 :(得分: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);
答案 2 :(得分:0)
在回答您最近的问题时,您可以在适配器之外和活动中设置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));
}
如果不是这样,请告诉我们错误,以便我们引导您朝着正确的方向前进。