2017-02-14 12 views
0

私の問題はBundle bundle=getArgument();がnullです。オブジェクトデータをフラグメントからシリアライズ可能なフラグメントに渡すには?

試してみますActivitySerializable activitySerializableTest=(ActivitySerializable)bundle.getSerializable("activitySerializable");もnullです。

レイアウトがフラグメントのときに、オブジェクトから値を取得するにはどうすればよいですか?

ご協力いただければ幸いです。

このような私のSerializableのcalss:

public class ActivitySerializable implements Serializable { 
     private String EDUTITLE; 

     public String getEDUTITLE() { 
      return EDUTITLE; 
     } 

     public void setEDUTITLE(String EDUTITLE) { 
      this.EDUTITLE = EDUTITLE; 
     } 
} 

私のフラグメントは、このように値を設定しよう:

public class ActivityListDomesticFragment extends Fragment{ 

    ....... 

    @Override 
     public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 

      ActivitySerializable activitySerializable=new ActivitySerializable(); 

      activitySerializable.setEDUTITLE("Value"); 

      //set the Bundle 

      ActivityContents activityContentsFragment=new ActivityContents();//i want to get value from this fragment 

      Bundle serializableBundle=new Bundle(); 


      serializableBundle.putSerializable("activitySerializable",activitySerializable); 


      activityContentsFragment.setArguments(serializableBundle);//send bundle 

      switchFragment(activityHomePage);//switch to next Fragment 
    } 
//change fragment function 
private void switchFragment(Fragment fragment) { 
    FragmentManager manager = getActivity().getSupportFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    transaction.replace(R.id.mainFrame, fragment, null); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

私のBフラグメントは、次のように値を取得する:

public class ActivityContents extends Fragment{ 
    @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.activity_contents_fragment, container, false); 


      Bundle bundle = getArguments(); 
      // it shows my activitySerializableTest is on a null object reference 
      ActivitySerializable activitySerializableTest=(ActivitySerializable)bundle.getSerializable("activitySerializable"); 

        String test=activitySerializableTest.getEDUIN(); 
        activityCtEduin.setText(test); 
        if (bundle != null) { 
        String EDUTITLE=activitySerializable.getEDUTITLE(); 
         activityCtTitle.setText(EDUTITLE); 
      else{ 
       //bundle is null 
      } 
      return view; 
     } 
} 

MainActivityの引き出しアイテムをクリックして、ActivityContentsに変更します。フラグメント

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/drawerLayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context="com.example.user.taiwandigestionsociety_v11.MainActivity"> 


     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#FFFFFF"> 


    <include layout="@layout/toolbar"/> 

//fragment change over here------------------------------------- 
      <FrameLayout 
       android:id="@+id/mainFrame" 
       android:layout_gravity="end" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

      </FrameLayout> 

     </android.support.design.widget.AppBarLayout> 


     <android.support.design.widget.NavigationView 
      android:id="@+id/nav_view" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      android:background="@android:color/transparent" 
      android:fitsSystemWindows="true" 
      app:headerLayout="@layout/nav_header"> 
     </android.support.design.widget.NavigationView> 


    </android.support.v4.widget.DrawerLayout> 

変更についての私のMainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
....... 

@Override 
    public void onClick(View view) { 
if (id == R.id.activitiesContents) { 
      //here is change to ActivityContents fragment 
      switchFragment(ActivityContents.newInstance()); 
      drawerLayout.closeDrawer(GravityCompat.START); 
     } 
} 
+0

Bフラグメントのクラス名は何ですか? –

+0

私はそれを更新しました、それはpublic class ActivityContents extends Fragment(B fragment) –

+0

引数を設定してurフラグメントを表示する方法を教えてください –

答えて

1

Fragmentは、フィールドの初期化子としてgetArgumentsを呼び出すべきではありません。ここ は、そのレイアウトです。ライフサイクルコールバック(onCreateViewなど)から呼び出します。オブジェクトが作成されているとき、引数はまだ設定されていないので、現在のコードは常にnullに戻ります。

Serializableの代わりにParcelableを使用すると、より効率的です。また、引数がプリミティブまたは文字列の場合は、SerializableまたはParcelableを使用する必要はありません。Bundleはプリミティブ型および文字列を直接処理します。

+0

私の 'Bundle bundle = getArguments();'はあなたが応答してくれてありがとう、onCreatViewの下にあります。 バンドルでしか試していなかったので、それは成功します。私のプロジェクトはObjectの値を保存して完了する必要があるため、BundleではなくSerializableを使用します。 –

+0

申し訳ありませんが、私はあなたが言っていることに本当に従っていません。あなたが何を意味しているのかを明確にし、何が起きているのかを明確に示すために、コードを更新して整理することをお勧めします。 –

+0

もう一度更新しました。この問題は、 'ActivitySerializable activitySerializableTest =(ActivitySerializable)bundle.getSerializable(" activitySerializable ");'をコンパイルしたときにヌルオブジェクト参照で表示される –

0

私は私の問題を保存するための解決策を見つけ、それがシングルトンについてです:

私はこのような私のBookクラスのためにそれを使用する:Aで

public static Book book=null; 

    public static Book getBook(){ 
     if (book==null){ 
      book=new Book(); 
      return book; 
     }else { 
      return book; 
     } 
    } 

Book book=Book.getBook(); 
book.setName("Jerry"); 

でC:

Book book=Book.getBook(); 
textView.setText(book.getName()); 

私の問題は終わった、私は私の状態でSerializableをあきらめなければならない。

関連する問題