2016-10-14 36 views
1

我有一些主要的活動與一些元素。其中之一是一個按鈕。我想單擊按鈕時加載一個片段。我希望片段能夠覆蓋整個活動,而不僅僅是一個佈局。然後在片段中還有一個Button,它必須加載另一片片段,以涵蓋所有內容,然後是另一片片段等等。在活動頂部的片段

所以我在Activity上設置了一個OnClickListener來加載第一個碎片。活動加載得很好。如果我點擊其他活動的按鈕,一切都很好。但是不管我嘗試過什麼,當我點擊應該加載片段的按鈕時,它總是崩潰。

這裏的主要活動代碼:

public class SignUpActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_sign_up); 

    Button next = (Button) findViewById(R.id.button_next_name); 
    next.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
      SignNameFragment nameFragment = new SignNameFragment(); 
      fragmentTransaction.add(PROBABLY_WHAT_I_AM_DOING_WRONG,nameFragment); 
      fragmentTransaction.addToBackStack(null); 
      fragmentTransaction.commit(); 
     } 
    }); 
} 
} 

所有的XML是幾乎一樣的。 Activity的RelativeLayout,Fragments和ScrollView的FrameLayout,ImageView,EditText,TextView和Button。

事情我想到目前爲止,根據網絡上的建議:

  • 主要活動的XML使用RelativeLayout的。我試圖加載的片段,但它未能
  • 我改變它的FrameLayout
  • 我用fragmentTransaction.add(R.id.fragment_container,nameFragment)
  • 除了使用加()的,我試過更換(R.id.activity_sign_up,nameFragment)
  • 延伸到FragmentActivity
  • 設置一個的FrameLayout作爲我的主要活動的XML片段容器

我相信我的錯誤是,我沒有設置,我想在...中添加片段正確的方法。

我非常確定這將是一個菜鳥的錯誤,但我從來沒有使用過Fragments。那麼有什麼建議?

感謝

編輯: 當我點擊按鈕

E/AndroidRuntime這就是錯誤:致命異常:主要 過程:be.test.test,PID:16763 的java .lang.RuntimeException:[email protected]必須在layout.SignNameFragment.onAttach(SignNameFragment.java:84)上實現OnFragmentInteractionListener ,位於android.support.v4.app.FragmentM的 anagerImpl.moveToState(FragmentManager.java:1043) at android.support.v4.app.BackStackRecord.setLastIn(BackStackRecord.java:838) at android.support.v4.app.BackStackRecord.calculateFragments(BackStackRecord.java:861) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1677) at android.support.v4.app。android.support.v4.app.BackStackRecord.run(BackStackRecord.java:719) FragmentManagerImpl $ 1.run(FragmentManager.java:536) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper .loop(活套。java:145) at android.app.ActivityThread.main(ActivityThread.java:6145) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java :372) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1399) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

+0

你爲什麼不發佈錯誤? –

+1

[如何實現OnFragmentInteractionListener](http://stackoverflow.com/questions/24777985/how-to-implement-onfragmentinteractionlistener) –

+0

如果您不需要OnFragmentInteractionListener,則可以將其完全刪除。 –

回答

1

你的錯誤說明了這一切,你不是implementinginterface

您的SignUpActivity需要實現接口OnFragmentInteractionListener,然後您必須重寫其方法。

應該是這樣的:

public class SignUpActivity extends AppCompatActivity implements SignNameFragment.OnFragmentInteractionListener { 
    //implement the interface methods here 
} 
+0

就是這樣。我猜所有我檢查的例子都是舊的,並沒有使用OnFragmentInteractionListener。奇怪的是我沒有真正使用它,但沒有它的應用程序崩潰。 –

+0

如果它已幫助您,可以將其標記爲已接受,如果您未使用該界面,則可以隨時將其刪除。 –

+0

稍後我可能需要它來傳輸數據。但是我不明白爲什麼如果它沒有被使用,我必須執行它。 –

1

您應該在activity_sign_up.xml中使用FrameLayout並替換FragmentManager方法以用另一個片段替換片段

fragmentManager.beginTransaction().replace(R.layout.activity_sign_up, nameFragment).commit(); 

I'll使用這樣的代碼:

public class SignUpActivity extends AppCompatActivity { 

      private FragmentManager fragmentManager; 
      private Fragment switchFragment; 

      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_sign_up); 

       fragmentManager = getSupportFragmentManager(); 

       switchFragment nameFragment = new SignNameFragment(); 
       fragmentManager.beginTransaction() 
        .add(R.layout.activity_sign_up, switchFragment) 
        .commit(); 


      } 

      public void cambiarFragment(){ 
       switchFragment = new anyTypeFragment(); 
       fragmentManager.beginTransaction() 
        .replace(R.layout.activity_sign_up, switchFragment) 
        .commit(); 
       } 
    } 

和nameFragment類:

public class nameFragment extends Fragment { 

    private Button next; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //Inicializar Modelo 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v= inflater.inflate(R.layout.nameFragment_fragment_layout,container,false); ///Cargar XML, Vista Padre, Si quiero dejarlo siempre 

     next=(Button)v.findViewById(R.id.btn_crear_grupo); 

     next.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

         ((SignUpActivity) getActivity()).cambiarFragment(); 
        } 


       } 
      }); 



     return v; 


    } 
} 

那裏,你可以創造任何你想要的片段類。

+0

但是不替換需要一個id類型?替換(int,Fragment) –

+0

嘗試了你的解決方案,但沒有幫助我的情況。無論如何感謝您的幫助。 –