现在我知道人们之前已经多次问过这个问题了,我读了所有这些帖子:
NullPointerException with Fragment Interface Listener
Click listener inside a fragmentactivity with Page Adapter
button inside a fragment doesn't work
button inside a fragment doesn't work
但我仍然不知道如何使这个简单的代码工作。 所以我用2个片段创建了一个 viewpager ,在片段 A 中有一个按钮,每次点击它时都不会执行 onClickListener 没有例外。
片段活动java
public class Asec extends FragmentActivity {
ViewPager vp = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_asec);
vp = (ViewPager) findViewById(R.id.pager);
vp.setAdapter(new ma(getSupportFragmentManager()));
}
}
class ma extends FragmentPagerAdapter {
public ma(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int arg0) {
Fragment a = null;
if (arg0 == 0) {
a = new A();
}
if (arg0 == 1) {
a = new b();
}
return a;
}
@Override
public int getCount() {
return 2;
}
}
片段活动xml
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:id="@+id/pager"
android:layout_width="match_parent">
</android.support.v4.view.ViewPager>
片段一个java
public class A extends Fragment{
Button b;
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = (RelativeLayout) inflater.inflate(R.layout.av, container, false);//this is line A
b = (Button) view.findViewById(R.id.button1);//this is line B
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("work");//this is not printed
}
});
return inflater.inflate(R.layout.av, container, false);
}
}
我尝试使用 getView()。findViewById(...)这一行的替代方式,但它仍无法正常工作
片段A 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:background="#33D692">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="23dp"
android:layout_marginTop="28dp"
android:text="Fragment A"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true"
android:layout_marginTop="53dp"
android:text="Button" />
</RelativeLayout>
片段B java(从现在开始,不是很重要)
public class b extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.bv, container, false);
}
}
片段B 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:background="#F53636" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="23dp"
android:layout_marginTop="28dp"
android:text="Fragment B"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
我知道有很多像这样的问题,我实际上已经阅读了所有这些问题,并且没有答案真的很有帮助。 thanx评论这篇文章。
答案 0 :(得分:0)
解决方案是使用Activity,并更改一些代码。 XML文件可能是这样的:
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:id="@+id/pager"
android:layout_width="match_parent">
<fragment
android:id="@+id/fragment_a"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="logical.address.of.your.Fragment"/>
</android.support.v4.view.ViewPager>
并以这种方式更改您的Activity类:
mActionFragment = (ClassA)getFragmentManager().findFragmentById(R.id.fragment_a);
我希望它有效。
答案 1 :(得分:0)
在您的片段中,您要对布局进行两次充气:
View view = (RelativeLayout) inflater.inflate(R.layout.av, container, false);//this is line A
//...
return inflater.inflate(R.layout.av, container, false);
您设置点击侦听器的布局与屏幕上显示的布局不同。
返回您充气的view
并设置点击监听器,不要给另一个布局充气。
答案 2 :(得分:0)
我不知道它是否有帮助,但是:
@Override
public void onClick(View v) {
System.out.println("work");//this is not printed
}
这不起作用,因为System.out.println("")
在Android中不起作用。使用Log.d(tag, message)
代替调试消息,或Log.e(tag, message)
代替错误。