0

http://developer.android.com/training/basics/fragments/communicating.htmlhttp://developer.android.com/guide/components/fragments.html#の2つのリファレンスなど、さまざまなことを試しました。CommunicatingWithActivityとStackOverflowの他のユーザーの助けを借りて、ListFragment(FragmentA)に単純な文字列だけを別のListFragment(FragmentB)に送信させることができません。FragmentAのリストをクリックしてFragmentBに入ると、アプリがクラッシュし続け、NullPointerExceptionが発生します。私はこれに2日間立ち往生していて、壁に頭をぶつけたような気がします。誰かが何が悪いのか知っているなら、私の問題を解決するためにコードを投稿してください。

主な活動:

import com.example.fragmentcommunication.FragmentB.OnDataPass;

public class MainActivity extends Activity implements OnDataPass{
...
@Override
public void onCreate(Bundle savedInstanceState) {
...
@Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub
            String librarySelected = libraryList[position];
            Fragment newFragment = null;

            if (librarySelected.equals("Item1")){
                newFragment = new FragmentA();

            }

            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.replace(R.id.tab2, newFragment, "FragA");
            transaction.addToBackStack(null);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            transaction.commit();

        }

    });        
}

public void onDataPass(String data) {
    // TODO Auto-generated method stub

    FragmentB transaction1 = ((FragmentB) getFragmentManager().findFragmentByTag("FragB"));
    transaction1.use(data);
}
}

FragmentA:

public class FragmentA extends ListFragment{

... 
OnDataPass dataPasser;

public interface OnDataPass{
    public void onDataPass(String data);
}

@Override
public void onAttach(Activity a) {
    super.onAttach(a);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        dataPasser = (OnDataPass) a;
    } catch (ClassCastException e) {
        throw new ClassCastException(a.toString()
                + " must implement OnHeadlineSelectedListener");
    }
}


@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    String libraryList;

    //Get the position the user clicked.
    Fragment newFragment = null;

    libraryList = l.getItemAtPosition(position).toString();
    dataPasser.onDataPass(libraryList);

    if(libraryList.equals("Ranged")){
        newFragment = new FragmentB();          

    }

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.tab2, newFragment, "FragB");
    transaction.addToBackStack(null);
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    transaction.commit();
}

}

FragmentB:

public class FragmentB extends ListFragment{

...
String getListInfo;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);

    //Testing to see if the String was passed from Fragment A.
    System.out.println(getListInfo);

    ...

public void use(String data) {
    // TODO Auto-generated method stub
    this.getListInfo = data;

}   
}
4

1 に答える 1

1

ListFragment (FragmentA) から単純な文字列を別の ListFragment (FragmentB) に送信することはできません。

フラグメントの背後にある主なポイントは、両方が同時に画面上に存在しない可能性があることです (たとえば、-normal画面上) ため、FragmentA は FragmentB に「単純な文字列だけを送信」し​​ようとするべきではありません。FragmentB が存在しない可能性があります。

FragmentA を超える UI 効果を持つ可能性のあるイベントが FragmentA で発生した場合、FragmentA はそのイベントに関するホスティング アクティビティを通知する必要があります。次に、ホスティング アクティビティは、メソッドを直接呼び出す (アクティビティが FragmentB もホストする場合)、それを作成して UI に追加する (そして、ファクトリ メソッドを使用してデータを渡す) ことにより、イベントを他のフラグメントにルーティングできます。のようにnewInstance())、または別のアクティビティを起動するように呼び出すことによってstartActivity()(FragmentA と FragmentB のための十分なスペースがないため、FragmentB を示す別のアクティビティがある場合)。

既存のコードに関してgetListInfonull、値を割り当てないためです。

于 2012-09-07T23:24:24.190 に答える