我如何将适配器传递给片段,就像意图一样

时间:2017-08-21 13:00:26

标签: android android-fragments android-intent

我是Android的新手,我试图在点击后使用意图调用我的MapFragment以下是我的代码

以下是适配器代码:

public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
  final BusInfo info = getItem(position);
  View view = LayoutInflater.from(context).inflate(R.layout.bus_only_list,null);
  TextView busname;
  busname = (TextView) view.findViewById(R.id.busname);
  busname.setText(info.name);
  view.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
       pref = context.getSharedPreferences("busInfo",Context.MODE_PRIVATE);
       SharedPreferences.Editor editor = pref.edit();
       editor.putString("bus_name",info.name);
       editor.commit();

       Intent intent = new Intent(context, MapsFragment.class);
       intent.putExtra("name",info.name);
       context.startActivity(intent);>     

     }
  });

  return view;
}

我想使用intent传递给mapfragment,但它会重定向到MainActivity而不是MapFragment。如何停止转移到MainActivity?

谢谢。

3 个答案:

答案 0 :(得分:2)

将值传递给Fragment的常见模式是使用newInstance方法。在此方法中,您可以将Argument设置为fragment作为发送值的方法。

首先,创建newInstance方法:

public class YourFragment extends Fragment {
  ...

  // Creates a new fragment with bus_name
  public static YourFragment newInstance(String busName) {
    YourFragment yourFragment = new YourFragment();
    Bundle args = new Bundle();
    args.putString("bus_name", busName);
    yourFragment.setArguments(args);
    return yourFragment;
  }

  ...
}

然后您可以在onCreate中获取值:

public class YourFragment extends Fragment {
  ...

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Get the value from arguments
    String busName = getArguments().getString("bus_name", "");  
  }

  ...
}

您可以使用以下命令将活动的值设置为片段:

FragmentTransaction fragTransaction = getSupportFragmentManager().beginTransaction();
YourFragment yourFragment = YourFragment.newInstance("bus_name_value");
fragTransaction.replace(R.id.fragment_place_holder, yourFragment);
fragTransaction.commit();

您可以使用上述代码在片段初始化中发送值。

如果要将值设置为已实例化的片段,可以创建一个方法,然后调用该方法来设置值:

public class YourFragment extends Fragment {
  ...

  public setBusName(String busName) {
    // set the bus name to your fragment.
  }

  ...
}

现在,在活动中,您可以使用以下命令调用它:

// R.id.yourFragment is the id of fragment in xml
YourFragment yourFragment = (YourFragment) getSupportFragmentManager()
                            .findFragmentById(R.id.yourFragment);
yourFragment.setBusName("bus_name_value");

答案 1 :(得分:1)

您无法将意图传递给片段。请尝试使用Bundle。

Bundle bundle = new Bundle();

bundle.putString("name", info.name);

mapFragment.setArguments(bundle)

在你的片段(MapsFragment)中,像这样获取Bundle:

Bundle bundle = this.getArguments();

if(bundle != null){
   String infoName = bundle.getString("name");
}

答案 2 :(得分:0)

正如之前提到的那样: 1.使用回调或仅对您的上下文进行强制转换(您的活动必须自己处理更改的碎片)。 2.要更改片段,请使用活动的FragmentManager - intent用于启动另一个活动。

Fragments Documentation