2017-02-16 9 views
0

Iamビルドインのナビゲーション・ドロワー・アクティビティーを使用して3つのフラグメント・メニューを使用して、データを1つから別のものに渡そうとしているフラグメントで通信したい。そして、私は断片とのコミュニケーションに3つの可能な方法があることを発見しました。また、私は断片が直接通信することはないことをはっきりと理解していました。最後に、現在はIAMはsecond methodを使用して、バンドル フラグメント間でオブジェクトを渡す

そして今、私の質問は、フラグメントと通信するための最良の方法であるあるを使用してインターフェイス

  • グローバルクラス(Applicationクラスを拡張する)
  • を使用して

    • 私はこれらのすべてのオブジェクトをGlobalized objects which extends Application Classに置いています(getter & setterクラス)。これは正しいアプローチかどうか?

  • +0

    のリンクを確認できますか? –

    +0

    私はオブジェクトを渡す必要があります – Narendhran

    +0

    あなたのモデルクラスをシリアル化し、フラグメント化されたオブジェクトを渡すputSerializable関数でバンドルにオブジェクトを配置します。 – nnn

    答えて

    3

    ObjectクラスにSerializableを実装し、バンドルを使用して単純に渡すことができます。私はあなたのfirst_fragmentからsecond_fragmentを起動していると仮定しています。フラグメント2で

    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    Fragment2 fragment2 = new Fragment2(); 
    
    Bundle bundle = new Bundle(); 
    YourObj obj = SET_YOUR_OBJECT_HERE; 
    bundle.putSerializable("your_obj", obj); 
    fragment2.setArguments(bundle); 
    ft.replace(android.R.id.content, fragment2); 
    ft.addToBackStack(null); 
    ft.commit(); 
    

    :あなたの最初のフラグメントで

    あなたのオブジェクトをシリアル化するため

    Bundle bundle = getArguments(); 
    YourObj obj= (YourObj) bundle.getSerializable("your_obj"); 
    

    EDIT

    、単にあなたのObjectクラスにSerializableを実装。

    あなたのObjectクラスはYourObj.class

    public class YourObj implements Serializable { 
        int id; 
        String name; 
    
        // GETTERS AND SETTERS 
    } 
    
    +0

    あなたの種類の応答のおかげで、あなたの答えを試してみましょう – Narendhran

    +0

    兄弟ありがとう、これは本当に私の問題を解決します – Narendhran

    +0

    私は 'Bundle bundle = getArguments(); YourObj obj =(YourObj)bundle.getSerializable( "your_obj"); '2番目のフラグメントのonCreateViewメソッドのコード?? – Narendhran

    3

    であればオブジェクトはモデルクラスがシリアライズまたはParcelableすることによってフラグメントと活動の間で渡すことができます。

    ParcelableはAndroidクラスであり、より複雑なクラスの直列化をサポートできます。 ここでParcebleクラスの実装を確認してください:http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/

    SerializableはJavaクラスであり、小さなオブジェクトに適しています。ここではSerializableをご覧ください :

    Fragment fragment = new Fragment(); 
    NewObject newObject = new NewObject(); 
    
    Bundle bundle = new Bundle(); 
    bundle.putParcelable("Object", newObject); 
    fragment.setArguments(bundle); 
    

    あなたのonCreate関数内の別のフラグメントの使用にバンドルからそれを取得するには:

    https://developer.android.com/reference/java/io/Serializable.html

    は、あなたのモデルクラスはのNewObjectは、あなたのフラグメントのクラスで、次の使用であると仮定します

    NewObject newObject = (NewObject) bundle.getParcelable("Object"); 
    
    1

    データHolderクラス:

    public class DataHolder implements Serializable{ 
    
         private String name,id; 
    
         public DataHolder(String id, String name) { 
          this.id = id; 
          this.name = name; 
    
         } 
    
         public String getId() { 
          return id; 
         } 
    
         public void setId(String id) { 
          this.id = id; 
         } 
    
         public String getName() { 
          return name; 
         } 
    
         public void setName(String name) { 
          this.name = name; 
         } 
        } 
    

    FragmentA:

    DataHolder dataholder=new DataHolder("1","TestName"); 
        Bundle bundle=new Bundle(); 
        bundle.putSerializable("obj",dataholder); 
    
        Fragment fragment=new FragmentB(); 
        fragment.setArguments(bundle); 
        fragmentManager = getActivity(). getSupportFragmentManager(); 
        fragmentTransaction = fragmentManager .beginTransaction(); 
        fragmentTransaction.add(R.id.container, fragment); 
        fragmentTransaction.commit(); 
    

    FragmentB:あなたの活動に

    DataHolder dataholder = (DataHolder)getArguments().getSerializable(obj); 
    
    2

    は、それらの断片をホスティング、変数を定義し、

    public class HomeActivity{ 
    
        public User mUser; 
        ... 
    } 
    

    、あなたのフラグメントでは、あなたからの応答を取得あなたのApiは、以下のように変数Userを初期化します:

    @Override 
    public void onClick(View view) { 
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, getString(R.string.RESTAPI_URL), null, new Response.Listener<JSONObject>() { 
    
         @Override 
         public void onResponse(JSONObject response) { 
          Log.d("Response: ",response.toString()); 
          Gson gson = new Gson(); 
          User user = gson.fromJson(String.valueOf(response),User.class); 
    
          // initialise User variable in Home Activity 
          ((HomeActivity)getActivity()).mUser = user; 
         } 
        }, new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          Log.d("ErrorResponse: ",error.toString()); 
         } 
        }); 
         RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); 
         requestQueue.add(jsonObjectRequest); 
    

    }

    と仮定すると、あなたのUserクラスがParcelableインタフェースを実装し、そうでない場合は、単にそのクラスParcelableを作ります。これはJavaのSerializableと同じですが、ParcelableAndroidに最適化されています。あなたが第2のフラグメントをロードする際

    最後には、単に以下のように第2のフラグメントにユーザーオブジェクトを渡す:

    SecondFragment secondFragment = new SecondFragment(); 
    Bundle bundle = new Bundle(); 
    bundle.putParcelable("ARG_USER", user); 
    secondFragment.setArguments(bundle); 
    //...code for loading second fragment 
    
    +0

    2番目のフラグメントでユーザー変数を呼び出すのは、2番目のフラグメントで初期化されたのと同じです。 私は実際に '((HomeActivity)getActivity())。mUser = user'のようなものをフラグメントの前に断片的に実行しました。しかし、これは本当に大丈夫ですか?私はそれが死んで簡単だから好きです。 – Aba

    1

    あなたがバンドルインスタンスを使用することができますフラグメントの間を通過するために限られたデータが必要な場合。あなたが複雑なオブジェクトを持っている場合は、代わりに他の方法でインターフェイスを好むあなたを渡す。また、あなたが渡す必要がvlueにどのようなREFF

    関連する問題