2017-01-28 115 views
0

我在我的應用程序中有兩個活動。在MainActivity中我加載了2個片段Fragment1Fragment2。從Fragment1我正在跳躍Fragment2Fragment2我跳到Activity2包含Fragment2_1Fragment 2_1我想跳回到Fragment2MainActivity但是當我嘗試這樣做,我得到一個錯誤。來自不同活動的兩個片段之間的通信?

我想知道是否有可能從1個活動片段跳到另一個活動片段?

我的代碼是:

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction(); 
     Fragment fragment1=new Fragment1(); 
     fragmentTransaction.replace(R.id.mainContainer,fragment1,"MainActivity"); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 


    } 
} 

Fragment1.java:

public class Fragment1 extends Fragment { 


    public Fragment1() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view=inflater.inflate(R.layout.fragment_fragment1, container, false); 
     Button buttonfrag1=(Button)view.findViewById(R.id.buttonfrag1); 
     buttonfrag1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       FragmentManager fragmentManager=getActivity().getSupportFragmentManager(); 
       FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction(); 
       Fragment2 fragment2 = new Fragment2(); 
       fragmentTransaction.replace(R.id.mainContainer,fragment2,"Fragment1"); 
       fragmentTransaction.addToBackStack(null); 
       fragmentTransaction.commit(); 

      } 
     }); 

     return view; 
    } 

Fragment2.java

public class Fragment2 extends Fragment { 


    public Fragment2() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view= inflater.inflate(R.layout.fragment_fragment2, container, false); 
     Button buttonfrag2=(Button)view.findViewById(R.id.buttonfrag2); 
     buttonfrag2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent=new Intent(getActivity(),Activity2.class); 
       startActivity(intent); 

      } 
     }); 

     return view; 

    } 

} 

Activity2.java

public class Activity2 extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_2); 
     FragmentTransaction fragmentTransaction=getSupportFragmentManager().beginTransaction(); 
     Fragment2_1 fragment2_1=new Fragment2_1(); 
     fragmentTransaction.replace(R.id.frag2_1,fragment2_1,"Activity2"); 
     fragmentTransaction.commit(); 


    } 
} 

Fragment2_1.java

public class Fragment2_1 extends Fragment { 


    public Fragment2_1() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     View view= inflater.inflate(R.layout.fragment_fragment2_1, container, false); 
     Button buttonfrag2_1=(Button)view.findViewById(R.id.buttonfrag2_1); 
     buttonfrag2_1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       FragmentTransaction fragmentTransaction=getFragmentManager().beginTransaction(); 
       Fragment2 fragment2=new Fragment2(); 
       fragmentTransaction.replace(R.id.mainContainer,fragment2,"frag2_1"); 
       fragmentTransaction.addToBackStack(null); 

       fragmentTransaction.commit(); 
      } 
     }); 

     return view; 
    } 

} 

所有的代碼工作正常,但是當我想從Fragment2_1移動到片段1我的應用程序崩潰與一個例外:

java.lang.IllegalArgumentException: No view found for id 0x7f0b0059 (saleskit.orbitsys.com.fragmentdemo:id/mainContainer) for fragment Fragment2{29eb9c90 #1 id=0x7f0b0059 frag2_1} 
+0

你有答案嗎?在下面檢查我的答案。 @champadorid –

回答

1

試試這個:在Fragment2_1

buttonfrag2_1.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Intent intent = new Intent(getActivity(), MainActivity.class); 
        intent.putExtra("frag", "fragment2"); 
        startActivity(intent); 
       } 
      }); 

現在主要活動onResume()你的第二個活動中在你Fragment2_1加載maincontainer

你想要的片段MainActivity

@Override 
public void onResume(){ 
    super.onResume(); 

    Intent intent = getIntent(); 

if(intent.getExtras() != null) 
{ 
String frag = intent.getStringExtra("frag"); 
} 


    switch(frag){ 

    case "fragment2": 
     //here you can load Fragment2 to your activity as usual; 
     fragmentManager.beginTransaction().replace(R.id.mainContainer, new Fragment2()).commit(); 
     break; 
    } 
} 
+0

嘿謝謝你的回覆,但通過你的回答我在Activity2我想再次移動Fragment2當用戶點擊按鈕Fragment2_1 – Champandorid

+0

添加此'fragmentTransaction.replace(R.id.frag2_1,fragment2,「frag2_1」);''在你的'Fragment2_1'去'Fragement2' – rafsanahmad007

+0

發生異常,因爲你正在傳遞fragment2_1中的錯誤id到fragment2 – rafsanahmad007

0

你試圖把Fragment2容器R.id.mainContainer。下面的代碼:

FragmentTransaction fragmentTransaction=getFragmentManager().beginTransaction(); 
Fragment2 fragment2=new Fragment2(); 
fragmentTransaction.replace(R.id.mainContainer,fragment2,"frag2_1"); 
fragmentTransaction.addToBackStack(null); 
fragmentTransaction.commit(); 

但因爲你目前你的第二個活動內部的容器不存在(這是你的第一個活動的一部分)。您需要再次加載您的MainActivity或通過致電finish()完成Activity2。如果你做的更晚的android會自己帶你回到你的MainActivity,並且你從Fragment2移動到Activity2 android也會記住那個並且告訴你Fragment2

你Fragment2_1應該是這樣的:

public class Fragment2_1 extends Fragment { 

    public Fragment2_1() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     View view= inflater.inflate(R.layout.fragment_fragment2_1, container, false); 
     Button buttonfrag2_1=(Button)view.findViewById(R.id.buttonfrag2_1); 
     buttonfrag2_1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       getActivity().finish(); 
      } 
     }); 

     return view; 
    } 

} 

OR,如果你只是想顯示Fragment2在你的第二個活動,你可以做這樣的事情:

public class Fragment2_1 extends Fragment { 


    public Fragment2_1() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     View view= inflater.inflate(R.layout.fragment_fragment2_1, container, false); 
     Button buttonfrag2_1=(Button)view.findViewById(R.id.buttonfrag2_1); 
     buttonfrag2_1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       FragmentTransaction fragmentTransaction=getFragmentManager().beginTransaction(); 
       Fragment2 fragment2=new Fragment2(); 
       fragmentTransaction.replace(R.id.frag2_1,fragment2,"frag2"); 
       fragmentTransaction.addToBackStack(null); 

       fragmentTransaction.commit(); 
      } 
     }); 

     return view; 
    } 

} 

R.id.frag2_1是您需要替換片段的容器。

請注意:您仍將處於第二個活動狀態。片段將被替換。

+0

問題是,先生。我無法完成第二個活動。 – Champandorid

+0

@champadorid你不能或者你不想? –

+0

@Champandorid查看我更新的答案。 –

相關問題