添加片段以使其无法正常工作

时间:2017-10-15 13:14:35

标签: android android-fragments

我正在研究片段而我正在做一个基本的例子,但它不起作用。

我有一个基本的例子,我有2个活动: - 一个带有图像和文本视图的活动,当单击图像时,我转到另一个具有包含某些项目的列表视图的活动。单击此列表视图后,我将返回主活动,并在textview中显示与单击列表项关联的文本。

但是现在我试图通过这个基本的例子,但只使用只有一个活动的片段,但它不起作用,当点击图像时,它总是出现“app has stopped”。

我正在做什么,我不知道它是否是最好的解决方案,主要活动只是需要点击的图像,以便它显示带有列表视图的片段。并且有2个片段,一个用于显示列表视图,另一个用于显示带有所单击项目文本的textview。

现在我只是做第一部分,就是点击图像并用列表视图显示片段,当点击片段上的项目时显示带有toast的消息。但它不起作用,似乎总是“app has”停止“。

所以我的主要活动是:

public class MainActivity extends AppCompatActivity {

private ImageView img;
private TextView tv;
Intent intent;

FragmentManager fragmentManager;

@Override
protected void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    fragmentManager = getFragmentManager();

    img = (ImageView) findViewById(R.id.imageView);
    tv = (TextView) findViewById(R.id.textView);


}


public void AddFragmentList(View view) {
    Fragment fragment = new Fragment();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.add(R.id.listviewInFragment, fragment, "frag");
    transaction.commit();
}

}

主要活动xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/image"
        android:onClick="AddFragmentList"
        tools:layout_editor_absoluteY="71dp"
        tools:layout_editor_absoluteX="0dp" />


    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="11dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="110dp">

    </FrameLayout>


</android.support.constraint.ConstraintLayout>

在片段java中:

public class fragment extends Fragment {

    private ListView listItems;

    private String[] items = {
            "item1",
            "item2",
            "item3",
            "item4"
    };

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, container, false);

        return view;

        }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);


        listItems = (ListView) listItems.findViewById(R.id.listviewInFragment);


        ArrayAdapter<String> adapter =
                new ArrayAdapter<String>(getActivity().getApplicationContext(),
                        android.R.layout.simple_list_item_1, android.R.id.text1, items);

        listItems.setAdapter(adapter);

        listItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                int positionCode = i;
                String clickedValue = (String) listItems.getItemAtPosition(positionCode);

                Listener listener = (Listener) getActivity();
                listener.addText(clickedValue);

                Toast.makeText(getActivity().getApplicationContext(), clickedValue, Toast.LENGTH_SHORT).show();

            }

        });
    }
}

在片段xml中:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0ff">

    <ListView
        android:layout_width="368dp"
        android:layout_height="495dp"
        android:layout_marginLeft="8dp"
        android:layout_marginStart="16dp"
        android:id="@+id/listviewInFragment"/>

</android.support.constraint.ConstraintLayout>

1 个答案:

答案 0 :(得分:0)

拥有FrameLayout

的ID
 <FrameLayout
    andorid:id="@+id/container"
    android:layout_width="0dp"

然后改变

 transaction.add(R.id.listviewInFragment, fragment, "frag");

 transaction.add(R.id.container, new fragment(), "frag");

最后改变这个

 listItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            int positionCode = i;
            String clickedValue = (String) listItems.getItemAtPosition(positionCode);

            Listener listener = (Listener) getActivity();
            listener.addText(clickedValue);

            Toast.makeText(getActivity().getApplicationContext(), clickedValue, Toast.LENGTH_SHORT).show();

        }

   listItems.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            String clickedValue = (String) adapterView.getItemAtPosition(i);

            Toast.makeText(getActivity().getApplicationContext(), clickedValue, Toast.LENGTH_SHORT).show();

        }

此外,您可以将接口作为callbaclk添加到活动中。不确定您使用Listener listener = (Listener) getActivity();listener.addText(clickedValue);做了什么 这应该有助于https://developer.android.com/training/basics/fragments/communicating.html