0

У меня есть MainActivity с тремя фрагментами в нем, и я хочу переключиться на Activity2 из одного из фрагментов в MainActivity, но мои попытки всегда терпят неудачу. Мое приложение падает, когда я нажимаю кнопку ok в третьем фрагменте, чтобы подключить меня к Activity2. Я работаю над кодом, который я нашел в одном учебнике. Заранее спасибо!Ошибка запуска активности из фрагмента андроида

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 listener добавить это в состояние переключателя 'case R.id.btn_logout: Intent intent = new Intent (getActivity(), activity2.class); startActivity (намерение); break; ' –

ответ

0

добавить getActivity как контекст перед тем startActivity() добавить NewTask флага.

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

Я пробовал свой путь, но мое приложение снова падает. – Victoria

+0

@ Victoria, так что отправляйте журналы ошибок, может быть другая причина для сбоя. –

+1

Спасибо, мне удалось найти мою ошибку, и это не было в вашем коде, это было в activity2.класс и все работало нормально :) – Victoria

0

Вы не мог бы назвать метод goToLogin() в фрагменте, вам нужно позвонить в вашей деятельности содержит этот фрагмент, потому что ваш фрагмент не содержит макет fragment_frame, он находится в вашей деятельности.

Если вы хотите, чтобы вызвать этот метод в вашем фрагменте, вы двигаетесь метод goToLogin() к yourActivity и вызвать в вашем фрагменте так:

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

Ошибка может произойти из-за того, что вы не зарегистрировали Activity2 в AndroidManifest.xml.

Но общаться с Фрагмент к деятельности, вы должны использовать 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

Для осуждается onAttach() в уровне API> = 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 устарел, когда я использую Activity. Когда я пытаюсь использовать Context, мое приложение аварийно завершает работу, возможно, потому что это API16, в то время как Context требует API23. Я полностью озадачен ... помогите мне пожалуйста – Victoria

+0

@ Victoria: Я обновил код. Метод onAttach() устарел командой разработчиков в API Level> = 23. –

+0

Спасибо, но мне, наконец, удалось справиться с этой проблемой, просто используя getActivity() вместо этого в Intent intent = new Intent (getActivity(), Activity2.class); – Victoria