【问题标题】:Intent within fragment works only half the time片段内的意图仅在一半时间内起作用
【发布时间】:2013-06-21 01:11:37
【问题描述】:

我正在尝试将带有数据的意图从 Activity A 传递到 FragmentActivity B 到 Fragment B。Activity A 的按钮启动 FragmentActivity B。“年份”字符串设置了一个过滤器,我使用该过滤器查询远程服务器上的 mysql 数据库.下面的代码有效,但只有一半的时间。

我不知道是什么原因导致它只过滤了一些时间,而在其他时候它只是返回未过滤的整个表。我猜它必须与我在片段中使用的意图相关,因为过滤器在没有片段的应用程序版本中正常工作。我将意图从 Activity A 发送到 FragmentActivity B 到 Fragment B 的方式似乎也效率低下。我该如何解决这个问题?

活动 A:

Button button1 = (Button)findViewById(R.id.button1);

    button1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
           Intent intent = new Intent();
            intent.setClass(FindMovie.this, ShowMovies.class);

            intent.putExtra("year", year1);

            startActivity(intent);
   }
    });

片段活动 B:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_movies);
    if (getSupportFragmentManager().findFragmentByTag(TAG) == null) {
        final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.add(android.R.id.content, new ImageGridFragment(), TAG);
        ft.commit();
    }



    Intent i = getIntent();

    year = i.getStringExtra("year");

              //resend through another intent to the fragment B
    Intent intent = new Intent(getApplicationContext(), ImageGridFragment.class);


        intent.putExtra("year", year);
   }

片段 B:

@Override
public View onCreateView(
        LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


    final View v = inflater.inflate(R.layout.image_grid_fragment, container, false);


    Bundle extras = getActivity().getIntent().getExtras();

    year = extras.getString("year");

 return v;
  }

【问题讨论】:

    标签: android android-intent fragment


    【解决方案1】:

    我认为这是一个线程计时问题,您的 FragmentActivityB 正在创建片段,该片段被发送到一个线程(我认为),然后您从原始线程添加新值,有时第二个线程很快足以在获取新值之前执行 FragmentB onCreateView。您可以做的是在 FragmentTransaction 期间添加 'year' 的值。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Create a new fragment and bundle
        Fragment fragment = new ImageGridFragment();
        Bundle bundle = new Bundle();
    
        // Put variables in bundle and add to fragment
        bundle.putString("year", getIntent().getStringExtra("year"));
        fragment.setArguments(bundle);
    
        // Insert the fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager
                .beginTransaction()
                .add(android.R.id.content, fragment)
                .commit();
    }
    

    在 FragmentB 中获取 'year',如下所示:

    year = getArguments().getString("year");

    我认为这会解决问题,但请告诉我会发生什么,

    干杯。

    【讨论】:

    • 多么棒的答案!太感谢了。它解决了这个问题。 “线程计时问题”是问题所在,我实际上只需将异步任务移动到 Bundle extras = getActivity().getIntent().getExtras(); year = extras.getString("year");
    • LuckyMe,这确实有效。我有一个小问题,我的片段位于可交换的选项卡视图中,所需的片段位于第 5 个选项卡中。当我使用此代码时,它会直接显示第 5 个屏幕。我该如何改变它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多