亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 FragmentPagerAdapter 中的片段之間傳遞數據

如何在 FragmentPagerAdapter 中的片段之間傳遞數據

臨摹微笑 2022-06-15 15:16:03
對于我的學術項目,我想創建一個帶有 4 個選項卡的應用程序。第一個將顯示最近添加到列表中的游戲,第二個將是搜索表單,第三個將顯示搜索結果,最后一個將顯示詳細信息。TabView我目前已經為4 個選項卡創建了代碼。問題是我想執行搜索以獲取列表中符合片段 2 搜索條件的項目,但我不知道如何將片段 2 中的數據(textView 數據和微調器)傳遞給片段3.我的代碼如下:MainActivity.java:import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.design.widget.TabLayout;import android.view.MenuInflater;import android.view.View;import android.support.design.widget.NavigationView;import android.support.v4.view.GravityCompat;import android.support.v4.widget.DrawerLayout;import android.support.v7.app.ActionBarDrawerToggle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.view.Menu;import android.view.MenuItem;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.widget.Button;import android.widget.Toast;public class MainActivity extends AppCompatActivity    implements NavigationView.OnNavigationItemSelectedListener {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(toolbar);        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);        fab.setImageResource(R.drawable.ic_search_white_24dp);        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)                    .setAction("Action", null).show();            }        });
查看完整描述

3 回答

?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

嘗試這個


使用 bundle 在兩個片段之間傳遞值


import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentPagerAdapter;


public class TabPagerAdapter extends FragmentPagerAdapter{


int tabCount;


 public TabPagerAdapter(FragmentManager fm, int numberOfTabs) {

super(fm);

this.tabCount = numberOfTabs;

}


 @Override

public Fragment getItem(int position) {

switch (position) {

    case 0:

        return  new HomeScreenFragment();

    case 1:

        return new SearchFormFragment();

    case 2:

       Fragment fragment = new SearchResultsFragment()

     Bundle args = new Bundle();

     args.putString("Key", "Value");

     fragment.setArguments(args);

        return fragment;


    case 3:

        return new DetailsScreenFragment();

    default:

        return null;

   }

}


    @Override

     public int getCount() {


   return tabCount;


   }

   }

在 SearchResultsFragment 的 onCreateView(....) 中


 String value = getArguments().getString("Key");

 public class SearchResultsFragment extends Fragment {


TextView infoTextView;

ListView listViewGames;


  public SearchResultsFragment() {

   // Required empty public constructor

 }



  @Override

  public View onCreateView(LayoutInflater inflater, ViewGroup container,

                     Bundle savedInstanceState) {


   View searchResultsView = 

  inflater.inflate(R.layout.fragment_search_results, container, false);

    String value = getArguments().getString("Key");



   return searchResultsView;

 }

 private void findViews(){


 infoTextView = getActivity().findViewById(R.id.info_textView);

listViewGames = getActivity().findViewById(R.id.games_listView);

 }

 }

跳它幫助你


查看完整回答
反對 回復 2022-06-15
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

您可以通過多種方式在片段之間傳遞對象/值。在您的情況下,最簡單的解決方案是將這些值委托給控股公司Activityie MainActivity。


主要活動:


import android.os.Bundle;

import android.support.design.widget.FloatingActionButton;

import android.support.design.widget.Snackbar;

import android.support.design.widget.TabLayout;

import android.view.MenuInflater;

import android.view.View;

import android.support.design.widget.NavigationView;

import android.support.v4.view.GravityCompat;

import android.support.v4.widget.DrawerLayout;

import android.support.v7.app.ActionBarDrawerToggle;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.Toolbar;

import android.view.Menu;

import android.view.MenuItem;

import android.support.v4.view.PagerAdapter;

import android.support.v4.view.ViewPager;

import android.widget.Button;

import android.widget.Toast;



public class MainActivity extends AppCompatActivity

    implements NavigationView.OnNavigationItemSelectedListener {

//these will hold your values

String filterGameTitle;

int filterGenreId;


@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);



    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

    setSupportActionBar(toolbar);


    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

    fab.setImageResource(R.drawable.ic_search_white_24dp);

    fab.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)

                    .setAction("Action", null).show();

        }

    });


    //TabLayout function call

    configureTabLayout();


    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(

            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

    drawer.addDrawerListener(toggle);

    toggle.syncState();


    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);

    navigationView.setNavigationItemSelectedListener(this);

}


@Override

public void onBackPressed() {

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

    if (drawer.isDrawerOpen(GravityCompat.START)) {

        drawer.closeDrawer(GravityCompat.START);

    } else {

        super.onBackPressed();

    }

}


@Override

public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.

    MenuInflater inflater = getMenuInflater();

    inflater.inflate(R.menu.main, menu);

    return true;

}


@Override

public boolean onOptionsItemSelected(MenuItem item) {


    switch (item.getItemId()){

        case R.id.menu_exit:

            finish();

            return true;

        case R.id.menu_settings:

            Toast.makeText(this, "Under Construction", Toast.LENGTH_LONG).show();

            return true;

            default:

                return super.onOptionsItemSelected(item);

    }

}


@SuppressWarnings("StatementWithEmptyBody")

@Override

public boolean onNavigationItemSelected(MenuItem item) {

    // Handle navigation view item clicks here.

    int id = item.getItemId();


    if (id == R.id.nav_camera) {

        // Handle the camera action

    } else if (id == R.id.nav_gallery) {


    } else if (id == R.id.nav_slideshow) {


    } else if (id == R.id.nav_manage) {


    } else if (id == R.id.nav_share) {


    } else if (id == R.id.nav_send) {


    }


    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

    drawer.closeDrawer(GravityCompat.START);

    return true;

}





//Tab Layout function declaration

private void configureTabLayout() {


    //Getting the tab layout

    TabLayout tabLayout = findViewById(R.id.tab_layout);


    //Adding Tabs

    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_home_white_24dp));

    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_search_white_24dp));

    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_results_white_24dp));

    tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.ic_details_white_24dp));



    //The TabPagerAdapter instance is then

    //assigned as the adapter for the ViewPager and the TabLayout component added

    //to the page change listener

    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);

    final PagerAdapter adapter = new TabPagerAdapter

            (getSupportFragmentManager(), tabLayout.getTabCount());

    viewPager.setAdapter(adapter);



    //Finally, the onTabSelectedListener is configured on the TabLayout instance and

    //the onTabSelected() method implemented to set the current page on the

    //ViewPager based on the currently selected tab number.

    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

        @Override

        public void onTabSelected(TabLayout.Tab tab) {

            viewPager.setCurrentItem(tab.getPosition());

        }

        @Override

        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override

        public void onTabReselected(TabLayout.Tab tab) {

        }

    });

}

}

搜索表單片段:


import android.content.Intent;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Spinner;

import android.widget.TextView;

import android.widget.Toast;



/**

 * A simple {@link Fragment} subclass.

 */

public class SearchFormFragment extends Fragment {


private Button searchButton;

private EditText gameTitleEditText;


Spinner spinnerGenre;




public SearchFormFragment() {

    // Required empty public constructor

}


@Override

public View onCreateView(final LayoutInflater inflater, ViewGroup container,

                         Bundle savedInstanceState) {


    View searchFormView = inflater.inflate(R.layout.fragment_search_form, container, false);


    searchButton = searchFormView.findViewById(R.id.searchButton);

    gameTitleEditText = searchFormView.findViewById(R.id.game_title_editText);

    spinnerGenre = searchFormView.findViewById(R.id.genre_spinner);


    ArrayAdapter<CharSequence> genreAdapter = ArrayAdapter.createFromResource(

            getActivity(),

            R.array.game_genres,

            android.R.layout.simple_spinner_item

    );


    genreAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spinnerGenre.setAdapter(genreAdapter);



    searchButton.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View v) {

            String filterGameTitle = gameTitleEditText.getText().toString();

            int filterGenreId = spinnerGenre.getSelectedItemPosition();

            ((MainActivity)getActivity()).filterGameTitle = filterGameTitle;

            ((MainActivity)getActivity()).filterGenreId = filterGenreId;

            String message = String.format("Game Title: %s\n Genre: %s", filterGameTitle, filterGenreId);

            Toast.makeText(getActivity(),message, Toast.LENGTH_LONG).show();


        }

    });


    // Inflate the layout for this fragment

    //return inflater.inflate(R.layout.fragment_search_form, container, false);

    return searchFormView;


}


}

搜索結果片段:


import android.content.Intent;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ListView;

import android.widget.TextView;



/**

 * A simple {@link Fragment} subclass.

 */

public class SearchResultsFragment extends Fragment {


TextView infoTextView;

ListView listViewGames;


String filterGameTitle;

int filterGenreId;


public SearchResultsFragment() {

    // Required empty public constructor

}


@Override

public void onAttach(Context context)

{

    filterGameTitle = ((MainActivity)getActivity()).filterGameTitle;

    filterGenreId = ((MainActivity)getActivity()).filterGenreId;


    super.onAttach(context);

}



@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

                         Bundle savedInstanceState) {


    View searchResultsView = inflater.inflate(R.layout.fragment_search_results, container, false);


    return searchResultsView;

}


private void findViews()

{

    infoTextView = getActivity().findViewById(R.id.info_textView);

    listViewGames = getActivity().findViewById(R.id.games_listView);

}



}


查看完整回答
反對 回復 2022-06-15
?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

您可以使用接口將您的搜索字符串從片段 2 發送到您的活動,并且您可以從它們調用片段 3 中的所有方法,因為片段3 對象將在您的活動中對您可用,您可以在片段 3 中創建 performSearch() 和從您的活動中調用它。或者,您可以使用事件總線之類的東西來避免設置界面所需的樣板代碼。


看看這個事件總線 repo https://github.com/greenrobot/EventBus 在你想要搜索字符串的地方注冊事件總線,在你的情況下,像這樣在 Fragment3 中注冊事件總線


  @Override

 public void onStart() {

 super.onStart();

 EventBus.getDefault().register(this);

 }


 @Override

 public void onStop() {

 super.onStop();

 EventBus.getDefault().unregister(this);

 }

在您的 Fragment 3 中創建一個這樣的函數


    @Subscribe

public void onSearchEvent(String searchString){

 //you will get your search string here

}

現在從您要發送 searchString 的位置返回到 fragment2,您必須將下面的代碼從您要發送 searchString 的位置放入,并且這個發布的 searchString 將由 Fragment 3 在其 onSearchEvent 方法中接收


EventBus.getDefault().post(searchString);


查看完整回答
反對 回復 2022-06-15
  • 3 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號