2014-09-07 3 views
0

Я пытаюсь создать простое приложение, которое отображает два фрагмента. Первый фрагмент отображается по умолчанию. Он содержит список имен, которые вы можете выбрать, и когда вы нажимаете на один из элементов, он предполагает отображать второй фрагмент с текстовым представлением, отображая выбранное вами имя.Невозможно добавить фрагменты - android

Проблема заключается в том, что каждый раз, когда я нажимаю одно из имен в списке, это бросает мне исключение NullPointerException. Я действительно не знаю, в чем проблема.

Вот коды (Приложение содержит три класса - два фрагмента и одно действие. Фрагмент FriendsF - это фрагмент списка, и он хорошо работает. Второй фрагмент - FeedFragment и onitemclick, на котором должно отображаться имя, которое было нажато)

фрагмент

FriendsF:

package com.example.fragmentsexcersize; 

import android.app.Activity; 
import android.app.ListFragment; 
import android.os.Build; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class FriendsF extends ListFragment { 

private static final String[] FRIENDS = { "ladygaga", "msrebeccablack", 
     "taylorswift13" }; 
public interface SelectionListener { 
    public void onItemSelected(int position); 
} 
private SelectionListener mCallback; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? android.R.layout.simple_list_item_activated_1 
      : android.R.layout.simple_list_item_1; 
    setListAdapter(new ArrayAdapter<String>(getActivity().getBaseContext(), layout, FRIENDS)); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mCallback = (SelectionListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement SelectionListener"); 
    } 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if (isInTwoPaneMode()) { 
     getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    } 
} 

@Override 
public void onListItemClick(ListView l, View view, int position, long id) { 
    mCallback.onItemSelected(position); 
} 

private boolean isInTwoPaneMode() { 
    return getFragmentManager().findFragmentById(R.id.tweets) != null; 
} 
} 

FeedFragment:

package com.example.fragmentsexcersize; 

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class FeedFragment extends Fragment{ 

private TextView mTextView; 
private static final String[] data = { "ladygaga", "msrebeccablack", 
"taylorswift13" }; 

public FeedFragment() { 

} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.tweet_view, container, false); 
    mTextView = (TextView) rootView.findViewById(R.id.tweet_view); 
    return rootView; 
} 

public void updateFeedDisplay(int position) { 
    mTextView.setText(data[position]); 
} 
} 

MainActivity:

package com.example.fragmentsexcersize; 

import android.app.Activity; 
import android.app.FragmentManager; 
import android.os.Bundle; 
import android.app.FragmentTransaction; 

public class MainActivity extends Activity implements FriendsF.SelectionListener{ 

private FriendsF mFriendsFragment; 
private FeedFragment mFeedFragment; 
private FragmentManager fragMana; 
private FragmentTransaction transaction; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mFriendsFragment = new FriendsF(); 
    fragMana = getFragmentManager(); 
    transaction = fragMana.beginTransaction(); 
    transaction.add(R.id.friends, mFriendsFragment); 
    transaction.commit(); 
} 

private boolean isInTwoPaneMode() { 
    return findViewById(R.id.tweets) == null; 
} 
public void onItemSelected(int position) { 

    if (mFeedFragment == null) 
     mFeedFragment = new FeedFragment(); 
    if (!isInTwoPaneMode()) { 
     transaction = fragMana.beginTransaction(); 
     transaction.add(R.id.tweets, mFeedFragment); 
     transaction.commit(); 
    } 
    mFeedFragment.updateFeedDisplay(position); 
} 
} 
+0

Пожалуйста, пост StackTrace. – woot

+0

http://i.gyazo.com/dd6c74b18e4b4b74a97b64bb5c060344.png –

ответ

0

Внести следующие изменения в исходный код:

MainActivity

public void onItemSelected(int position) { 

    Bundle bundle = new Bundle(); 
    if (mFeedFragment == null) 
     mFeedFragment = new FeedFragment(); 
    if (!isInTwoPaneMode()) { 
     bundle.putInt("POSITION", position); 
     mFeedFragment.setArguments(bundle); 

     transaction = fragMana.beginTransaction(); 
     transaction.replace(R.id.tweets, mFeedFragment); 
     transaction.commit(); 
    } 
} 

FeedFragment

private TextView mTextView; 
private static final String[] data = { "ladygaga", "msrebeccablack", 
"taylorswift13" }; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) { 
    View rootView = inflater.inflate(R.layout.tweet_view, container, false); 
    mTextView = (TextView) rootView.findViewById(R.id.tweet_view); 

    int mPosition = getArguments().getInt("POSITION", 0); 
    mTextView.setText(data[mPosition]); 
    return rootView; 
} 
Смежные вопросы