Android系统。获取listview项onClick内部按钮到新的子片段

时间:2016-08-24 15:05:40

标签: android listview android-fragments

我有一个带有row项的ListView的片段。 row只是ImageView

fragment_1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment_1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Fragment1">

    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:divider="#b5b5b5"
        android:dividerHeight="1dp"
        android:listSelector="@drawable/list_selector"/>

</RelativeLayout>

row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/row"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_selector"
    android:orientation="horizontal"
    android:padding="5dip">

    <!-- Rightend Play Button. -->
    <ImageView
        android:id="@+id/play_button"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:src="@drawable/ic_play"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"/>

</RelativeLayout>

我有一个ResourceCursorAdapter来填充此ListView。我只是为每个ImageView分配一个点击监听器。它播放保存在提供的路径中的记录。

private abstract class MyAdapter extends ResourceCursorAadpter {

    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
        // Play button.
        ImageView playButton = (ImageView) view.findViewById(R.id.play_button);
        playButton.setOnClickListener(new View.OnClickListener() {
            String record = cursor.getString(cursor.getColumnIndex(DbAdapter.RECORD));
            public void onClick(View v) {
                // Play record in path [record]. Not the problem.
            }
        });
    }
}

现在,我想在Fragment_2点击中打开一个新片段row。这个片段有相同的play_button,并且必须播放相同的记录。

fragment_2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragment_audio"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Fragment2">

    <!-- Play Button. -->
    <ImageView
        android:id="@+id/play_button"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ic_play"/>

</RelativeLayout>

如何管理此按钮播放的记录与Fragment_1中的记录相同?我认为如果我有一个带有记录路径的隐藏TextView,我可以做到你有一个更聪明的解决方案。

onCreateView的{​​{1}}。

Fragment_1

1 个答案:

答案 0 :(得分:2)

片段之间的通信应通过相关的活动完成。你可以使用接口。它将作为它们之间的契约和桥梁。

让我们拥有以下内容:

  

活动托管片段并允许片段通信

     

FragmentA 将发送数据的第一个片段

     

FragmentB 第二个片段,它将从 FragmentA

接收数据

FragmentA的实施是:

public class FragmentA extends Fragment {
  DataPassListener mCallback;
  public interface DataPassListener{
    public void passData(String data);
  }
  @Override
  public void onAttach(Activity activity) {
    super.onAttach(activity);
    // Make sure that container activity implement the callback interface
    try {
      mCallback = (DataPassListener)activity;
    } catch (ClassCastException e) {
      throw new ClassCastException(activity.toString()
            + " must implement DataPassListener");
    }
  }
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    // Suppose that when a button clicked second FragmentB will be inflated
    // some data on FragmentA will pass FragmentB
    // Button passDataButton = (Button).........
    passDataButton.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (view.getId() == R.id.passDataButton) {
          mCallback.passData("Text to pass FragmentB");
        }
      }
    });
  }
}

MainActivity实施是:

public class MainActivity extends ActionBarActivity implements DataPassListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (findViewById(R.id.container) != null) {
        if (savedInstanceState != null) {
            return;
        }
        getFragmentManager().beginTransaction()
                .add(R.id.container, new FragmentA()).commit();
    }
}
@Override
public void passData(String data) {
    FragmentB fragmentB = new FragmentB ();
    Bundle args = new Bundle();
    args.putString(FragmentB.DATA_RECEIVE, data);
    fragmentB .setArguments(args);
    getFragmentManager().beginTransaction()
        .replace(R.id.container, fragmentB )
        .commit();
}
}

FragmentB的实现是:

public class FragmentB extends Fragment{
final static String DATA_RECEIVE = "data_receive";
TextView showReceivedData;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_B, container, false);
    showReceivedData = (TextView) view.findViewById(R.id.showReceivedData);
}
@Override
public void onStart() {
    super.onStart();
    Bundle args = getArguments();
    if (args != null) {
        showReceivedData.setText(args.getString(DATA_RECEIVE));
    }
}

https://developer.android.com/training/basics/fragments/communicating.html 本文档详细给出了信息,您可以通过它。

在您的情况下,您可以使用这种方式在两个片段之间进行通信。