web-dev-qa-db-ja.com

Android親アクティビティからフラグメントリストを更新します

3つのメニューボタンが含まれたアクションバーを含むメインアクティビティがあります。

次に、このメインアクティビティ内にリストがあるフラグメントがあります。

メニューボタンの1つがクリックされたとき、またはできればリストからすべての行を削除したときに、メインアクティビティからのフラグメントのリストを更新できるようにしたいと思います。

どんな助けでもありがたいです。

ありがとう。

public class Favourite extends SherlockFragmentActivity {

    ActionBar actionBar;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.favourite);

        actionBar = getSupportActionBar();

        actionBar.setDisplayShowTitleEnabled(false);

        BitmapDrawable bg = (BitmapDrawable)getResources().getDrawable(R.drawable.actionbar_bg);
        bg.setTileModeX(TileMode.REPEAT); 
        getSupportActionBar().setBackgroundDrawable(bg);

        getSupportActionBar().setIcon(R.drawable.favourite_title);

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ActionBar.Tab tabAll = actionBar.newTab();
        ActionBar.Tab tabfavs = actionBar.newTab();
        ActionBar.Tab tabhist = actionBar.newTab();
        tabAll.setText("all");
        tabfavs.setText("favs");
        tabhist.setText("hist");
        tabAll.setTabListener(new MyTabListener());
        tabfavs.setTabListener(new MyTabListener());
        tabhist.setTabListener(new MyTabListener());
        actionBar.addTab(tabAll);
        actionBar.addTab(tabfavs);
        actionBar.addTab(tabhist);


        try{

        }
        catch(Exception e)
        {
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getSupportMenuInflater();
        inflater.inflate(R.menu.actionbar_itemlist_favourite, menu);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
                case R.id.history:
                    break;
                case R.id.favourite:
                    Intent favAct = new Intent(this, Favourite.class);
                    startActivity(favAct);
                    break;
                case R.id.delete:
                    ///I WANT TO BE ABLE TO REFRESH FRAGMENTLIST FROM HERE
                }
                return true;
    }

  }

class MyTabListener implements ActionBar.TabListener {

    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if(tab.getPosition()==0)
        {
            FavouriteAllWords frag = new FavouriteAllWords();
            ft.replace(Android.R.id.content, frag);

        }
        else if(tab.getPosition()==1)
        {
            FavouriteFavWords frag = new FavouriteFavWords();
            ft.replace(Android.R.id.content, frag);

        }
        else if(tab.getPosition()==2)
        {
            FavouriteHistWords frag = new FavouriteHistWords();
            ft.replace(Android.R.id.content, frag);
        }
    }

    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

}

////////////////////マイリストフラグメントクラス

public class FavouriteAllWords extends ListFragment {

    ArrayAdapter<String> adapter;

    List<String> stringOfFavWords;

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

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved)
    {   
        adapter = new ArrayAdapter<String>(  
                inflater.getContext(), R.layout.row, stringOfFavWords);  
                setListAdapter(adapter);  

        return super.onCreateView(inflater, group, saved);  
    }

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

}
18
user1319668

これはINTERFACEを使用して簡単に実現できます

MainActivity.Java

public class MainActivity extends Activity {

    public FragmentRefreshListener getFragmentRefreshListener() {
        return fragmentRefreshListener;
    }

    public void setFragmentRefreshListener(FragmentRefreshListener fragmentRefreshListener) {
        this.fragmentRefreshListener = fragmentRefreshListener;
    }

    private FragmentRefreshListener fragmentRefreshListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Button b = (Button)findViewById(R.id.btnRefreshFragment);

        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(getFragmentRefreshListener()!=null){
                    getFragmentRefreshListener().onRefresh();
                }
            }
        });


    }


    public interface FragmentRefreshListener{
        void onRefresh();
    }

}

MyFragment.Java

public class MyFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = null; // some view

        /// Your Code


        ((MainActivity)getActivity()).setFragmentRefreshListener(new MainActivity.FragmentRefreshListener() {
            @Override
            public void onRefresh() {

                // Refresh Your Fragment
            }
        });


        return v;
    }
}
27
Biraj Zalavadia
  • 更新/更新メソッドを公開して、アクティビティから呼び出すだけです。

OR

  • LocalBroadcastManagerまたはEventBusを使用して、アクティビティからイベントを送信し、フラグメントでこのイベントをサブスクライブする-これに反応して、更新/更新メソッドを呼び出します。
5
localhost

フラグメントへの参照を取得することにより、アクティビティはフラグメント内のメソッドを呼び出すことができます。

(1)フラグメントを追加するときにタグを提供します。

transaction.add(R.id.fragment_container, myFragment, "myfragmentTag");

(2)hostingアクティビティでフラグメントを見つけ、そのメソッドにアクセスできます。

FragmentManager fm = getSupportFragmentManager();
myFragment f = (myFragment) fm.findFragmentByTag("myfragmentTag");
f.refreshAdapter()

(3)refreshAdapter()がadapter.notifyDataSetChanged()を呼び出せるようになりました。

これは、フラグメントまで通信するための推奨される方法の1つです。インターフェースの実装は、主にアクティビティに通信するためのものです。

4
Jeffrey

Biraj Zalavadiaの答えは100%正解です。インターフェイスを使用してフラグメントメソッドを呼び出します...このインターフェイスメソッドはエラーなしで実行されています...

上記のMainActivityでこれを使用してください。oncreateprivate FragmentRefreshListener fragmentRefreshListener;

public FragmentRefreshListener getFragmentRefreshListener() {
    return fragmentRefreshListener;
}

public void setFragmentRefreshListener(
        FragmentRefreshListener fragmentRefreshListener) {
    this.fragmentRefreshListener = fragmentRefreshListener;
}

活動中

private void refreshcall(String result2) {
    // TODO Auto-generated method stub
    if (getFragmentRefreshListener() != null) {
        getFragmentRefreshListener().onRefresh(result2);
    }

}

これを必要なフラグメントに入れます

private FragmentRefreshListener fragmentRefreshListener;

    public FragmentRefreshListener getFragmentRefreshListener() {
        return fragmentRefreshListener;
    }

    public void setFragmentRefreshListener(
            FragmentRefreshListener fragmentRefreshListener) {
        this.fragmentRefreshListener = fragmentRefreshListener;
    }
1
Hardik Patel

ActionBarのいずれかのボタンをクリックすると、インターフェイスが呼び出され、ListFragmentが更新されます。なぜなら、Javaインターフェースは相互通信に使用されるためです。

0
Ramkailash

Kotlinでアクティビティからサポートフラグメントのリストを取得し、インスタンスを確認してからフラグメント関数を呼び出します

val fragments = supportFragmentManager.fragments
            for (fragment in fragments) {
                if (fragment is HomeCategoriesFragment) {
                    fragment.updateAdapter() // Define function in Fragment 
                }
            }
0
Amit Sharma

他のフラグメントとの通信

http://developer.Android.com/training/basics/fragments/communicating.html

これは、アクティビティとフラグメント間の通信にも使用できます。

0