0
目標

フラグメントのスワップに使用するコードを置き換えるメソッドを作成して、コピーと投稿を最小限に抑える (そして DRY を維持する) 方法を作成しようとしています。

問題

引数として渡したクラスを使用して、そのクラスの新しいインスタンスを作成しようとすると、エラーが発生します。

エラーは、次のコード行の演算子 (等号) の左側で発生します。

newFragmentClass new_fragment = newFragmentClass.newInstance();     

それが私に与えるエラーは、「newFragmentClassを型に解決できません」です。

完全なコード
    private void changeFragment(Class<?> newFragmentClass)
    {
        // Detect the current fragment
            Fragment current_fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    
        // Create a new instance of the given class, edit later to gracefully handle errors
            newFragmentClass new_fragment = newFragmentClass.newInstance(); 
            
        // Switch to the new fragment
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.detach(current_fragment);
            transaction.replace(R.id.fragment_container, new_fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            transaction.commit();
            
        // Change the tab background to indicate that the tab is active, reset backgrounds for any other tabs
            findViewById(R.id.page_one_tab).setBackgroundResource(R.drawable.menu_button_background_active);
            findViewById(R.id.page_two_tab).setBackgroundResource(R.drawable.menu_button_background);
            findViewById(R.id.page_three_tab).setBackgroundResource(R.drawable.menu_button_background);
    
    }
    
    // Page One Tab Button Functionality
    public void pageOneTab (View v)
    {
        // Change the fragment to SelectPlayersFragment
        changeFragment(Page_One_Fragment.class);
    }
試みられた解決策

StackOverflow とインターネット全体をかなり長い間検索してきましたが、解決策を見つけることができませんでした。このようないくつかのトピックは問題を解決するように見えましたが、その後、transaction.replace 行でエラーが発生し、修正が見つかりませんでした。は引数 (int、Object) には適用されません。」

4

4 に答える 4

1

「newFragmentClass」はメソッドのパラメーターにすぎないため、型ではないため、インスタンス化できません。私のコードに従って問題を解決してください

private <T extends Fragment> void changeFragment(Class<T> newFragmentClass)
    {
        // Detect the current fragment
            Fragment current_fragment = getSupportFragmentManager().findFragmentById(R.id.content);

        // Create a new instance of the given class, edit later to gracefully handle errors
            T new_fragment = newFragmentClass.newInstance(); 

        // Switch to the player select fragment
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.detach(current_fragment);
            transaction.replace(R.id.fragment_container, new_fragment);
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            transaction.commit();

        // Change the tab background to indicate that the tab is active, reset backgrounds for any other tabs
            findViewById(R.id.page_one_tab).setBackgroundResource(R.drawable.menu_button_background_active);
            findViewById(R.id.page_two_tab).setBackgroundResource(R.drawable.menu_button_background);
            findViewById(R.id.page_three_tab).setBackgroundResource(R.drawable.menu_button_background);

    }
于 2013-08-29T07:58:36.600 に答える
1

おそらく次のようなものが必要です。

private Fragment changeFragment(Class<? extends Fragment> newFragmentClass)  {
    Fragment current_fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    // Create a new instance of the given class, edit later to gracefully handle errors
    Fragment new_fragment = null;
    try {
         new_fragment = newFragmentClass.newInstance();
    } catch (InstantiationException e) {            
        throw new RuntimeException(e); // for some reason this fragment loading has failed so crash
    } catch (IllegalAccessException e) {            
        throw new RuntimeException(e);
    } 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.detach(current_fragment);
    transaction.replace(R.id.fragment_container, new_fragment);
    // ...   
于 2013-08-29T07:54:04.893 に答える
1

Fragmentおそらく、より簡単な解決策は、 の代わりに を引数として渡し、Classそれを使用して現在のフラグメントを置き換えることです。また、現在のフラグメントをデタッチする必要はありませreplace()ん。

このようなもの:

public void changeFragment(Fragment fragment) {
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.fragment_container, fragment, "tag");
    transaction.commit();
    //.....
}

そして、あなたはそれを次のように使います:

changeFragment(new Page_One_Fragment());
于 2013-08-29T07:54:31.977 に答える
1

私はあなたがこれを望んでいると思います:

private <T extends Fragment> void changeFragment(Class<T> newFragmentClass)
{
    ...
    // Create a new instance of the given class, edit later to gracefully handle errors
    T new_fragment = newFragmentClass.newInstance(); 
    ...
}
于 2013-08-29T07:55:31.560 に答える