web-dev-qa-db-ja.com

フラグメント内のインテントを介してフラグメントを開始する

新しいフラグメントを起動して、データを表示したい。現在、私はそれぞれがフラグメントであるアクションバータブの束を持っているメインアクティビティを持っています。したがって、タブフラグメント内に、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)を使用できることを理解していますが、同じエラーが発生します。ここで探しているのは、新しいフラグメントを開く結果となるフラグメント内からインテントを起動する方法ですか?

26
Davek804

新しいフラグメントを開くことはできません。フラグメントは常にアクティビティによってホストされる必要があります。フラグメントが同じアクティビティ(タブなど)にある場合、戻るキーナビゲーションはトリッキーになります。そのフラグメントで新しい画面を開きたいと思います。

したがって、新しいアクティビティを作成して、そこに新しいフラグメントを配置するだけです。そのアクティビティは、アクティビティクラスを介して明示的に、またはintent filtersを介して暗黙的にインテントに反応します。

19
RaB

問題への答えは簡単です。現在のFragmentを新しいFragmentに置き換え、トランザクションをバックスタックにプッシュします。これにより、戻るボタンの動作が保持されます...

新しい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

52
slinden77

これを試してみてください:

public void ButtonClick(View view) {
    Fragment mFragment = new YourNextFragment(); 
    getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, mFragment).commit();
}
5
Amit Jayaswal

これを試してみてください:

private void changeFragment(Fragment targetFragment){

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

}
0
Gilad Brunfman