【问题标题】:How to pass data between fragments in FragmentPagerAdapter如何在 FragmentPagerAdapter 中的片段之间传递数据
【发布时间】:2025-12-03 12:10:01
【问题描述】:

对于我的学术项目,我想创建一个包含 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();
            }
        });

        //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) {
            }
        });
    }
}

TabPagerAdapter.java

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:
                return new SearchResultsFragment();
            case 3:
                return new DetailsScreenFragment();
            default:
                return null;
        }
    }
    @Override
    public int getCount() {
        return tabCount;
    }
}

SearchFormFragment.java

package gr.pliroforiki_edu.videogamedb;


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();

                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;

    }

}

SearchResultsFragment.java

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;




    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);



        return searchResultsView;
    }

    private void findViews()
    {
        infoTextView = getActivity().findViewById(R.id.info_textView);
        listViewGames = getActivity().findViewById(R.id.games_listView);
    }


}

我想通过片段归档以下内容:

ListActivity.java

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;


public class ListActivity extends AppCompatActivity {

private TextView textViewInfo;
private ListView listViewBooks;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);

    // Animation when this Activity appears
    overridePendingTransition(R.anim.pull_in_from_right, R.anim.hold);

    // Get user filters from Intent
    Intent intent = getIntent();

    String filterAuthor = intent.getStringExtra("AUTHOR");
    String filterTitle = intent.getStringExtra("TITLE");
    int filterGenreId = intent.getIntExtra("GENREID", 0);

    findViews();

    // Show user filters for information
    String message = String.format("Author: %s\nTitle: %s\nGenreId: %d",
            filterAuthor, filterTitle, filterGenreId);
    textViewInfo.setText(message);

    DataStore.LoadBooks(filterAuthor, filterTitle, filterGenreId);

    //Complex Object Binding
    ListAdapter booksAdapter = new SimpleAdapter(
            this,
            DataStore.Books,
            R.layout.list_item,
            new String[]{DataStore.KEY_TITLE, DataStore.KEY_AUTHOR, DataStore.KEY_GENRENAME},
            new int[]{R.id.book_item_title, R.id.book_item_author, R.id.book_item_genre}
    );

    listViewBooks.setAdapter(booksAdapter);

    listViewBooks.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent detailsIntent = new Intent(ListActivity.this, DetailsActivity.class);
            detailsIntent.putExtra(DataStore.KEY_POSITION, position);
            startActivity(detailsIntent);
        }
    });
}

@Override
protected void onPause(){
    overridePendingTransition(R.anim.hold, R.anim.push_out_to_right);
    super.onPause();
}

private void findViews(){
    textViewInfo = findViewById(R.id.textViewInfo);
    listViewBooks = findViewById(R.id.listViewBooks);
}


}

Mainactivity.java

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;



public class MainActivity extends AppCompatActivity {

private EditText textAuthor;
private EditText textTitle;
private EditText textGenre;
private Button buttonSearch;
private Spinner spinnerGenre;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    DataStore.Init(getApplicationContext());

    textAuthor = findViewById(R.id.editTextAuthor);
    textTitle= findViewById(R.id.editTextAuthor);
    buttonSearch = findViewById(R.id.buttonSearch);
    spinnerGenre = (Spinner) findViewById(R.id.spinnerGenre);

    ArrayAdapter<CharSequence> genreAdapter = ArrayAdapter.createFromResource(
            this,
            R.array.book_genres,
            android.R.layout.simple_spinner_item
    );

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

    buttonSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String filterAuthor = textAuthor.getText().toString();
            String filterTitle = textTitle.getText().toString();
            int filterGenreId = spinnerGenre.getSelectedItemPosition();

            Intent intent = new Intent(MainActivity.this, ListActivity.class);
            intent.putExtra("AUTHOR", filterAuthor);
            intent.putExtra("TITLE", filterTitle);
            intent.putExtra("GENREID", filterGenreId);
            startActivity(intent);
        }
    });
}
}

【问题讨论】:

  • 使用ViewModelinfo
  • 你能给我一个示例代码吗?
  • 我为什么要这样做?它在提供的答案中
  • 如我所见,我需要提供一个桥梁课程,对吧?
  • ... 您需要创建 ViewPagerViewHolder 来保存数据。然后您可以使用相同的 ViewModel 实例来共享数据。接受的答案是足够的信息。

标签: java android android-fragments fragmentpageradapter


【解决方案1】:

试试这个

使用 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);
 }
 }

它会帮助你

【讨论】:

    【解决方案2】:

    您可以通过多种方式在片段之间传递对象/值。在您的情况下,最简单的解决方案是将这些值委托给控股Activity,即MainActivity

    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) {
            }
        });
    }
    }
    

    SearchFormFragment:

    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);
    }
    
    
    }
    

    【讨论】:

    • @TasosKaratzoglou 检查我对 SearchResultFragment 的更新我使用了 onAttach 方法来确保在片段附加到它之前我不会访问活动。
    • OnAttach android studio 说它已被弃用
    • 检查新的onAttach
    • 您有 Skype 或邮件可以向您发送我的私人 GitHub 存储库吗?它似乎不起作用。我现在真的被困住了。我似乎没有找到让搜索工作的方法。我的目标是对 json 数据执行搜索并在 listview 或 recycleview 中显示结果
    【解决方案3】:

    您可以使用接口将您的搜索字符串从片段 2 发送到您的活动,并且您可以从中调用片段 3 中的所有方法,因为片段3 对象将在您的活动中可供您使用,您可以在您的 fragment3 并从您的活动中调用它。 或者,您可以使用事件总线之类的东西来避免设置界面所需的样板代码。

    看看这个事件总线回购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);
    

    【讨论】:

    • 你能提供一些代码示例吗?我现在真的被困住了。我似乎没有找到让搜索工作的方法。我的目标是对 json 数据执行搜索并在 listview 或 recycleview 中显示结果 -
    • 如果我有多个搜索条件;
    • 什么类型的条件?请详细说明。
    • 1-3 个文本字段和 1-3 个微调器。我只是获取变量中的字段并通过我创建的总线函数发送它们;
    • 是的,您也可以发送完整的对象,例如:您想从 Fragment3 发送 MyObject 类的整个对象名称 myObject,您可以通过调用 EventBus.getDefault().post(searchString) 但现在要在 fragment2 中接收此对象,您必须更改 searchEvent 函数的参数类型,例如 @Subscribe public void searchEvent(MyObject object){}