0

我有MainActivity其中有3個片段,我想從MainActivity中的片段之一切換到Activity2,但我的嘗試總是失敗。當我按下第三個片段中的按鈕ok將我連接到Activity2時,我的應用程序崩潰。我正在研究我在一篇教程中找到的代碼。先謝謝你!從片段android啓動活動錯誤

public class ProfileFragment extends Fragment implements View.OnClickListener { 

    private TextView tv_name,tv_email,tv_message; 
    private SharedPreferences pref; 
    private AppCompatButton btn_change_password,btn_logout, btn_ok; 
    private EditText et_old_password,et_new_password; 
    private AlertDialog dialog; 
    private ProgressBar progress; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.fragment_profile,container,false); 
     initViews(view); 
     return view; 

    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 

     pref = getActivity().getPreferences(0); 
     tv_name.setText("Здравей, "+pref.getString(Constants.NAME,"")+"!"); 
     tv_email.setText(pref.getString(Constants.EMAIL,"")); 
     btn_ok=(AppCompatButton)view.findViewById(R.id.btn_ok); 
     btn_ok.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent=new Intent(getActivity(),activity2.class); 
       startActivity(intent); 
      } 
     }); 



    } 

    private void initViews(View view){ 

     tv_name = (TextView)view.findViewById(R.id.tv_name); 
     tv_email = (TextView)view.findViewById(R.id.tv_email); 
     btn_change_password = (AppCompatButton)view.findViewById(R.id.btn_chg_password); 
     btn_logout = (AppCompatButton)view.findViewById(R.id.btn_logout); 
     btn_ok=(AppCompatButton)view.findViewById(R.id.btn_ok); 
     btn_change_password.setOnClickListener(this); 
     btn_logout.setOnClickListener(this); 


    } 


    @Override 
    public void onClick(View v) { 
     switch (v.getId()){ 

      case R.id.btn_chg_password: 
       showDialog(); //I deleted this method from the code, it doesnt have a lot in common with my question 
       break; 
      case R.id.btn_logout: 
       logout(); 
       break; 
} 

    private void logout() { 
     SharedPreferences.Editor editor = pref.edit(); 
     editor.putBoolean(Constants.IS_LOGGED_IN,false); 
     editor.putString(Constants.EMAIL,""); 
     editor.putString(Constants.NAME,""); 
     editor.putString(Constants.UNIQUE_ID,""); 
     editor.apply(); 
     goToLogin(); 
    } 

    private void goToLogin(){ 

     Fragment login = new LoginFragment(); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_frame,login); 
     ft.commit(); 
    } 


} 
+0

什麼是你的錯誤,你有沒有在聲明活性2明顯嗎? –

+0

你可以顯示R.layout.fragment_profile? –

+0

您的片段已經實現的onclick監聽器添加這對開關狀態 '情況R.id.btn_logout: 意向意圖=新意圖(getActivity(),activity2.class); startActivity(intent); 突破;' –

回答

0

startActivity() 還添加NewTask標誌前加getActivity作爲背景。

Intent intent = new Intent(getActivity(), activity2.class); 
intent.addflags(intent.flag_activity_new_task); 
getActivity().startActivity(intent); 
+0

我想你的方式,但我的應用程序再次崩潰。 – Victoria

+0

@Victoria所以送的錯誤日誌有可能是另一個原因崩潰。 –

+1

謝謝你,我設法找到了我的錯誤,這是不是在你的代碼,它是在活性2。類和一切工作正常:) – Victoria

0

你不能調用方法goToLogin()的片段,你需要在你的活動來調用包含此片段,因爲您的片段不包含在你的活動佈局fragment_frame,它的。

如果要調用這個方法在你的片段,你的一舉一動方法goToLogin()到yourActivity並調用您的片段是這樣的:

if(getActivity() instanceOf yourActivity) { 
     ((youActivity) getActivity()).goToLogin(); 
} 
0

錯誤可能發生,因爲您沒有在AndroidManifest.xml中註冊Activity2。

但溝通從片段活動,你應該使用在MainActivity作爲柵極它。雖然看起來有些過火,但它可以幫助您在將來爲更大的項目進行維護。

您可以使用接口這一點。

在你ProfileFragment定義和創建一個接口:

public class ProfileFragment extends Fragment implements View.OnClickListener { 

    OnProfileListener mCallback; 

    // Container Activity must implement this interface 
    public interface OnProfileListener { 
     public void onProfileButtonOkClicked(); 
    } 

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

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

    ... 
    ... 
} 

然後調用接口在你點擊按鈕的方法:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    ... 
    btn_ok=(AppCompatButton)view.findViewById(R.id.btn_ok); 
    btn_ok.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mCallback.onProfileButtonOkClicked(); 
     } 
    }); 
    ... 
} 

最後,你需要實現這個接口用於連接MainActivity:

public static class MainActivity extends Activity 
     implements ProfileFragment.OnProfileListener{ 
    ... 

    // When button ok in ProfileFragment clicked, this method will be called. 
    public void onProfileButtonOkClicked() { 
     // we can call the Activity here now. 
     Intent intent=new Intent(this, activity2.class); 
     startActivity(intent); 
    } 
} 

欲瞭解更多詳情,請閱讀Communicating with Other Fragments


UPDATE

對於API級別棄用onAttach()> = 23,可以使用下面的代碼來代替:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof OnProfileListener) { 
     mCallback = (OnProfileListener) context; 
    } else { 
     throw new RuntimeException(context.toString() 
       + " must implement OnProfileListener"); 
    } 
} 
+0

它說onAttach已棄用,當我使用活動。當我嘗試使用上下文時,我的應用程序開始崩潰可能是因爲它是API16而上下文需要API23。我完全不解...請幫助我 – Victoria

+0

@Victoria:我已經更新了代碼。 onAttach()方法在API Level> = 23時被android團隊棄用。 –

+0

謝謝,但我最終設法通過在Intent中使用getActivity()而不是這個intent = new Intent(getActivity())來解決這個問題。 Activity2.class); – Victoria