我的Android应用程序正在给碎片没有附加到活动错误。

时间:2015-10-24 11:49:40

标签: android

//这是我的代码
我的目标是在片段上添加自定义列表视图,并在活动创建时将其激活

// FragmentSongs.java

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;

public class FragmentSongs extends ListFragment implements OnItemClickListener {

    ListView listview;
     String[] Songs=getResources().getStringArray(R.string.songs);
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

            MyAdapter adapter=new MyAdapter(getActivity(),Songs);
            listview.setAdapter(adapter);
            listview.setOnItemClickListener(this);
            View myview=inflater.inflate(R.layout.fragment_songs, container,false);
            return myview;
           }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        Toast.makeText(getActivity(), Songs[position], Toast.LENGTH_SHORT).show();

    }   

}

// MyAdapter.java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter<String>{

    Context context;
    String[] songs;

    LayoutInflater inflater;
    public MyAdapter(Context context,String[] songs) {
        super(context,R.layout.songlist_row);
        this.context=context;
        this.songs=songs;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView==null)
        {
            inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=inflater.inflate(R.layout.songlist_row, null);
        }

        TextView tv1=(TextView) convertView.findViewById(R.id.textView1);
        tv1.setText(songs[position]);
        return convertView;

    }
    }

// MainActivity.java

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.print("Reached");
        FragmentSongs songs=new FragmentSongs();
        FragmentManager fm=getSupportFragmentManager();
        FragmentTransaction transaction=fm.beginTransaction();
        transaction.add(R.id.fragment1,songs);
        transaction.commit();


    }
}

// activitymain.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/activitylayout"
    android:orientation="vertical">

    <fragment
        android:id="@+id/fragment1"
        android:name="android.app.ListFragment"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

//
  

这是我想要附加到activitymain

的片段的名称

fragment_songs.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:baselineAligned="false" >

    <ListView
        android1:id="@+id/listView1"
        android1:layout_width="match_parent"
        android1:layout_height="0dp"
        android1:layout_weight="1" >
    </ListView>

</LinearLayout>

// songlist_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp"
    android:background="#1A237E" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:text="Large Text"
        android:background="#C5CAE9"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:background="#C5CAE9"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView2"
        android:layout_alignBottom="@+id/textView2"
        android:layout_alignRight="@+id/textView1"
        android:layout_toRightOf="@+id/textView2"
        android:background="#C5CAE9"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

有两种插入活动片段的方法,您同时使用这两种方式。

第一种方式是: 在活动的布局文件中声明片段。 但在这种情况下,片段将像视图一样固定在活动上。

第二种形式是: 以编程方式将片段添加到现有ViewGroup。 在这种情况下,您可以随时将该片段添加到活动中,将其替换为另一个片段,并在需要时删除该片段。

您可以看到我告诉您观看此Android开发人员的链接并查看&#34;将片段添加到活动&#34;。

Fragments Android Developers

注意:如果您决定以编程方式添加片段,则不必在XML Activity中引用它。另一方面,这些线将是:

    FragmentSongs songs=new FragmentSongs();
    FragmentManager fm=getSupportFragmentManager();
    FragmentTransaction transaction=fm.beginTransaction();
    transaction.add(R.id.content,songs);
    transaction.commit();

R.id.content:它是容器的id,您可以在您的案例中以编程方式在activitymain.xml LinearLayout上添加片段。正如你所看到的,你不喜欢这样,但你把片段的id链接起来是错误的。

嗯,不要忘记你不应该使用两种方式添加片段,所以选择一个并希望提示你发现它有用。