Начать фрагмент через намерение внутри фрагмента - PullRequest
26 голосов
/ 23 марта 2012

Я хочу запустить новый фрагмент для просмотра некоторых данных.В настоящее время у меня есть основной вид деятельности, в котором есть несколько вкладок панели действий, каждая из которых является фрагментом.Итак, внутри фрагмента вкладки у меня есть кнопка chartsButton.У меня уже есть мой onclicklistener, и вот метод onClick:

public OnClickListener chartsListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        Intent chartFragment = new Intent();
        startActivity(chartFragment);   
    }
};

Теперь, как я уже сказал, этот слушатель находится в классе, который расширяет Fragment.Итак, я хочу запустить новый фрагмент (chartsFragment) через намерение заменить весь экран.Когда пользователь нажимает кнопку назад, он возвращает его на вкладки и в основное действие.Вот мой фрагмент диаграммы:

public class chartsFragment extends Fragment {

    public View onCreateView() {
        //LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState
        LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        return (inflater.inflate(R.layout.chartfragment, null));
    }
}

Текущая ошибка, с которой я имею дело: "android.content.ActivityNotFoundException: не найдена активность для обработки Intent {}".Хорошо, я понимаю, что мог бы использовать getActivity (). StartActivity (chartsFragment), но это приводит к той же ошибке.Я предполагаю, что я ищу здесь, как мне запустить намерение из фрагмента, что приводит к открытию нового фрагмента?

Ответы [ 4 ]

50 голосов
/ 20 июля 2013

Ответ на вашу проблему прост: замените текущий Fragment новым Fragment и перенесите транзакцию в backstack.Это сохраняет поведение кнопки возврата ...

Создание нового Activity действительно разрушает всю цель использования фрагментов в любом случае ... очень непродуктивно.

@Override
public void onClick(View v) {
    // Create new fragment and transaction
    Fragment newFragment = new chartsFragment(); 
    // consider using Java coding conventions (upper first char class names!!!)
    FragmentTransaction transaction = getFragmentManager().beginTransaction();

    // Replace whatever is in the fragment_container view with this fragment,
    // and add the transaction to the back stack
    transaction.replace(R.id.fragment_container, newFragment);
    transaction.addToBackStack(null);

    // Commit the transaction
    transaction.commit(); 
}

http://developer.android.com/guide/components/fragments.html#Transactions

19 голосов
/ 23 марта 2012

Вы не можете открывать новые фрагменты. Фрагменты должны всегда размещаться в деятельности. Если фрагмент находится в том же действии (например, вкладки), навигация по клавише «Назад» будет сложной, я предполагаю, что вы хотите открыть новый экран с этим фрагментом.

Таким образом, вы просто создадите новое действие и поместите туда новый фрагмент. Затем эта активность будет реагировать на намерение либо явно через класс активности, либо неявно через intent filter s.

5 голосов
/ 02 июня 2014

Попробуйте, это может вам помочь:

public void ButtonClick(View view) {
    Fragment mFragment = new YourNextFragment(); 
    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mFragment).commit();
}
0 голосов
/ 14 октября 2015

Попробуйте, это может вам помочь:

private void changeFragment(Fragment targetFragment){

    getSupportFragmentManager()
         .beginTransaction()
         .replace(R.id.main_fragment, targetFragment, "fragment")
         .setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
         .commit();

}
...