2014-08-29 2 views
-1

Теперь я знаю, что люди уже задавали этот вопрос много раз, и я прочитал все эти посты:кнопка слушатель не реагирует на фрагмент

NullPointerException with Fragment Interface Listener

Click listener inside a fragmentactivity with Page Adapter

button inside a fragment doesn't work

https://stackoverflow.com/questions/22286220/my-button-action-is-not-working-in-tabs-view-using-fragments

button inside a fragment doesn't work

findViewById in Fragment

и до сих пор я не знаю, как сделать этот простой код работать. Так я создал ViewPager с 2 фрагментами, в фрагменте есть кнопка и каждый раз, когда я нажимаю на него onClickListener не предварительно, и нет никаких исключений.

Фрагмент активности ява

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> 

Фрагмент ява

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 (. ..) и все еще не работает

фрагмент в 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

Решение заключается в использовании 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); 

Я надеюсь, что это работает.

0

В вашем фрагменте вы раздувание макета дважды:

View view = (RelativeLayout) inflater.inflate(R.layout.av, container, false);//this is line A 
//... 
return inflater.inflate(R.layout.av, container, false); 

Компоновки вы установили свой щелчок слушатель не то же самое, отображаемые на экране.

Верните view, вы завыли и установите прослушиватель кликов и не надувайте другой макет.

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).

Смежные вопросы