2

FragmentActivityにフラグメントがあります。このフラグメントはサーバーからデータをロードします。ユーザーが更新ボタンをクリックしてから、フラグメント内のメソッドを呼び出して更新プロセスを実行する必要があります。

FragmentActivityでインターフェイスを作成し、ユーザーが更新ボタンをクリックしたときにその変数を設定しました。コードは次のようになります。

public class MainScreen extends FragmentActivity {
    public interface OnRefreshSelected {
        public void refreshFragment(boolean flag);
    }

    private OnRefreshSelected onRefreshSelected;

    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Log.i(TAG, "Try to create MainScreen...");

            setContentView(R.layout.activity_main);

        onRefreshSelected = (OnRefreshSelected) MainScreen.this;
    }

     @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                    case R.id.menu_refresh:
                        onRefreshSelected.refreshFragment(true);
                        return true;
                    default:
                        return super.onOptionsItemSelected(item);
        }
    }
}

そしてFragmentクラスで私はこのインターフェースを実装しました:

public class CategoryFragment extends Fragment implements OnRefreshSelected {
    @Override
    public void refreshFragment(boolean flag) {
        Log.i(TAG, "refresh requested. Try to reload data for this fragment...");

        getData();
    }
} 

実行すると、アプリケーションがクラッシュし、logcatに次のメッセージが表示されます。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.astro.recipe.activities/com.astro.recipe.activities.MainScreen}: java.lang.ClassCastException: com.astro.recipe.activities.MainScreen

そしてこの線を指します:

onRefreshSelected = (OnRefreshSelected) MainScreen.this;

ホストからフラグメントのメソッドにアクセスするための最良の方法は何ですか?任意の提案をいただければ幸いです。ありがとう

4

2 に答える 2

4

これを実行する

onRefreshSelected = (OnRefreshSelected) MainScreen.this;

フィールドでアクティビティを割り当て、onRefreshSelectedそれをインターフェイスにキャストしようとしていますが、アクティビティがインターフェイスを実装していないため、ClassCastException発生します。

代わりにこのようなものを使用してください

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
                case R.id.menu_refresh:
                    CategoryFragment fragment = (CategoryFragment) getFragmentManager()
                        .findFragmentById(R.id.category_fragment);
                    if (fragment != null) {
                        fragment.getData();
                    }
                    return true;
                default:
                    return super.onOptionsItemSelected(item);
    }

アクティビティは、 findFragmentById()またはfindFragmentByTag( )を使用して、FragmentManagerからフラグメントへの参照を取得することにより、フラグメント内のメソッドを呼び出すことができます。

于 2012-07-20T12:05:04.277 に答える
-1

私はbiegleuxに同意します...しかし私の提案は

public class CategoryFragment extends Fragment{

   private static CategoryFragment categoryFrag;

    private CategoryFragment(){}

    public static CategoryFragment getInstance(){
        if(null == categoryFrag){
            categoryFrag = new CategoryFragment();
        }

        return categoryFrag;
    }

    public void  getData(){
       /*** Screen Refresh code****/
    }
} 

彼がオプションを選択したときに私はあなたのアクティブです

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
                case R.id.menu_refresh:
                    CategoryFragment fragment = CategoryFragment.getInstance();
                     fragment.getData();

                    return true;
                default:
                    return super.onOptionsItemSelected(item);
    }
于 2014-07-10T09:05:56.183 に答える