Java-在 Android Studio 中将数据从 Activity 发送到选项卡 fragment

标签 java android android-fragments android-activity

我是 Java 新手。该 Activity 是接收 ID 并重用该 ID 以通过 Recipe API 获取菜谱的详细信息。我使用三个选项卡来显示不同的内容。我无法弄清楚的问题是,第一个(描述选项卡)和第三个(步骤选项卡)可以从主 Activity 接收字符串,但第二个选项卡(成分选项卡)始终从主 Activity 接收空值。此外,当我运行 Activity 时,该字符串不会立即显示在第一个选项卡上。它仅在我单击第三个选项卡并返回第一个选项卡后显示。

Activity

public class SearchHomeResultActivity extends AppCompatActivity {


private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
public String RecipeId = "479101";
public String SInstruction;
public String SIngredients;
public String STitle;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_result);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

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

    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
    new CallMashapeAsync().execute(RecipeId);
}

public class CallMashapeAsync extends AsyncTask<String, Integer, HttpResponse<JsonNode>> {

    protected HttpResponse<JsonNode> doInBackground(String... msg) {


        HttpResponse<JsonNode> request = null;
        try {
            request = Unirest.get("https://spoonacular-recipe-food-nutrition-v1.p.mashape.com/recipes/" + msg[0] + "/information")
                    .header("X-Mashape-Key", "EulyPgSat2mshhTi8JJxY40UEWzdp1mMmEGjsnrbQq1AB0vuOY")
                    .header("X-Mashape-Host", "spoonacular-recipe-food-nutrition-v1.p.mashape.com")
                    .asJson();
        } catch (UnirestException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return request;
    }

    protected void onProgressUpdate(Integer... integers) {
    }

    protected void onPostExecute(HttpResponse<JsonNode> response) {
        String answer = response.getBody().toString();
        try {//get all response
            JSONObject obj = new JSONObject(answer);
            //get ingredients
            String Ringredient = obj.getString("extendedIngredients");
            List<String> terms1 = new ArrayList<String>();
            JSONArray ing = new JSONArray(Ringredient);
            for (int i = 0; i < ing.length(); i++) {
                JSONObject ING1 = ing.getJSONObject(i);
                String Ostr = ING1.getString("originalString");
                terms1.add(Ostr);
            }
            String listString = "";
            for (String s : terms1) {
                listString += s + "\n";
            }
            //get instructions
            String Rid1 = obj.getString("instructions");
            //get title
            String Rid2 = obj.getString("title");
            SInstruction = Rid1;
            SIngredients = listString;
            STitle = Rid2;
        } catch (JSONException e) {
            throw new RuntimeException(e);
        }


    }
}

public String getIns() {
    //
    return SInstruction;
}

public String getIngredients() {
    //
    return SIngredients;
}

public String getRTitle() {
    //
    return STitle;
}

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                descriptionTab tab1 = new descriptionTab();
                return tab1;
            case 1:
                IngredientsTabActivity tab2 = new IngredientsTabActivity();
                return tab2;
            case 2:
                StepTabActivity tab3 = new StepTabActivity();
                return tab3;
        }
        return null;
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
}

}

fragment

public class StepTabActivity extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){
    View rootView = inflater.inflate(R.layout.step_layout, container, false);
    SearchHomeResultActivity getData = (SearchHomeResultActivity) getActivity();
    String Rid = getData.getIngredients();
    TextView txt = rootView.findViewById(R.id.name);
    txt.setText(Rid);
    return rootView;



}

这是Step(第三个) fragment 的代码。其他两个是相同的,只是调用不同的方法来为 TextView 获取不同的字符串。 请帮我。非常感谢!

最佳答案

您可以在 fragment 中创建一个名为 newInstance 的类似构造函数的方法,如下所示,

public static FragmentName newInstance(String str) {
    Bundle args = new Bundle();
    FragmentName fragment = new FragmentName();
    fragment.setArguments(args);
    resID = str;
    return fragment;
}

将“resID”定义为全局变量并在 fragment 的 onCreate 方法中使用它。

当您将 fragment 添加到 viewPager 适配器时,从 Activity 中这样做

adapter.addFrag(FragmentName.newInstance(resID), "fragment_name");

关于Java-在 Android Studio 中将数据从 Activity 发送到选项卡 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48940970/

相关文章:

java - 向 int[] 的所有元素添加常量值的最短方法是什么?矩阵加法怎么样?

c# - 安卓 JSON 安全

java - Android:使用 Assets 目录中存储的 key 文件初始化 PublicKey

android - 将协程与 fragment 一起使用的最佳实践是什么?

java - Servlet 中的 Seam Logger?

java - MongoDB 和 MySql 事务

java - 我想按照这种格式的日期对 ListView 进行排序?在java android studio中

java - 我的应用程序在横向 View 中困惑

java - 使用 onCreateView 中的功能动态更改 View

java - WildFly,永远不要从 0.0.0.0 开始