2015-07-18 2 views
0

Я Следующие два фрагмента, содержащего TextView и кнопки:Android NullPointerException: Попытка вызвать виртуальный метод

public class MyFragmentText extends Fragment { 
public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE"; 

public static final MyFragmentText newInstance(String message) 
{ 
    MyFragmentText f = new MyFragmentText(); 
    Bundle bdl = new Bundle(1); 
    bdl.putString(EXTRA_MESSAGE, message); 
    f.setArguments(bdl); 
    return f; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    String message = getArguments().getString(EXTRA_MESSAGE); 
    View v = inflater.inflate(R.layout.layout_text, container, false); 
    TextView messageTextView = (TextView)v.findViewById(R.id.textView); 
    messageTextView.setText(message); 
    return v; 
} 

}

и

public class MyFragmentButton extends Fragment { 
    public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE"; 

    public static final MyFragmentButton newInstance(String message) 
    { 
     MyFragmentButton f = new MyFragmentButton(); 
     Bundle bdl = new Bundle(1); 
     bdl.putString(EXTRA_MESSAGE, message); 
     f.setArguments(bdl); 
     return f; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     String message = getArguments().getString(EXTRA_MESSAGE); 
     View v = inflater.inflate(R.layout.layout_button, container, false); 
     TextView messageTextView = (TextView)v.findViewById(R.id.textView); 
     messageTextView.setText(message); 

     return v; 
    } 
} 

и у меня есть три XML-файлы, которые являются:

Основная планировка:

<android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
</RelativeLayout> 

Кнопка раскладка

<TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <Button 
     android:id="@+id/button" 
     android:width="100dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click here"/> 
</RelativeLayout> 

TextView раскладка

<?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:orientation="vertical" > 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

</RelativeLayout> 

Теперь, когда я зову их от главной программы, чтобы показать раздвижные окна со следующим кодом, он работает хорошо.

общественного класса PageViewActivity расширяет FragmentActivity {

MyPageAdapter pageAdapter; 
Button btn; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_page_view); 

    List<Fragment> fragments = getFragments(); 
    pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments); 

    ViewPager pager = (ViewPager)findViewById(R.id.viewpager); 
    pager.setAdapter(pageAdapter); 

    //btn = (Button) findViewById(R.id.button); 
    //btn.setText("Hello World!!!"); 
} 

private List<Fragment> getFragments(){ 
    List<Fragment> fList = new ArrayList<Fragment>(); 

    fList.add(MyFragmentButton.newInstance("Fragment 1")); 
    fList.add(MyFragmentText.newInstance("Fragment 2")); 

    return fList; 
} 

private class MyPageAdapter extends FragmentPagerAdapter { 
    private List<Fragment> fragments; 

    public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) { 
     super(fm); 
     this.fragments = fragments; 
    } 
    @Override 
    public Fragment getItem(int position) { 
     return this.fragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 
} 

}

но если я применяю

btn = (Button) findViewById(R.id.button); 
     btn.setText("Hello World!!!"); 

это дает мне исключения нулевого указателя. Я предполагаю, что это связано с тем, что thet lauyout не раздувается, когда я звоню в btn. Я был бы признателен, если бы кто-нибудь мог предложить какое-либо решение.

+0

Можете ли вы показать точно activity_page_view расположение XML, пожалуйста? – MightySeal

+0

Mightyseal, я только что обновил сообщение, чтобы показать три файла макета – MKS

ответ

0

Насколько я undesrtand activity_page_view xml это:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
</RelativeLayout> 

Этот макет не имеет elemnt с помощью кнопки, поэтому btn = (Button) findViewById(R.id.button); возвращает null и btn.setText("Hello World!!!"); производит NPE

+0

Есть ли способ доступа к элементам управления из другого макета? Я имею в виду раздувание других макетов и доступ к элементам управления – MKS

+1

@MKS, вы можете создать метод в фрагменте, который будет возвращать управление, которое вы хотите, но идея звучит не очень хорошо. В основном лучше, когда компонент (активность или фрагмент) инкапсулирует его элементы управления. Если вы хотите изменить состояние элементов управления с другого компонента, вы должны каким-то образом отправить событие, которое элемент улавливает и обновляет элементы управления. Вы можете использовать трансляцию или шину событий, например otto. Если вам нужно простое решение - просто создайте для этого собственный интерфейс. – MightySeal

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