0

リストアダプターを使用して要素を表示するリストビューを持つアクティビティがあります。テキストを持つ要素がクリックされると、再生ボタン、シーク バー、メディア プレーヤーを持つフラグメントを作成する必要があります。ただし、アクティビティが呼び出されると、このエラーが発生します。

14 行目は list_songs で、"fragment" 開始タグを持つものです。

> 02-26 02:01:27.625: E/AndroidRuntime(2419): FATAL EXCEPTION: main
> 02-26 02:01:27.625: E/AndroidRuntime(2419):
> java.lang.RuntimeException: Unable to start activity
> ComponentInfo{com.songs/com.songs.display.DisplaysongDetails}:
> android.view.InflateException: Binary XML file line #14: Error
> inflating class fragment

アクティビティのコードは

public class DisplaysongDetails extends ListActivity {
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.list_songs);
    setListAdapter(new ArrayAdapter<String>(this, R.layout.row,songDetails));
    ListView listView = (ListView) this.findViewById(android.R.id.list);//getListView();
    listView.setTextFilterEnabled(true);
    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            String name = ((TextView) view).getText().toString();
            if (name=="Play")
            {
                PlayerFragment frag = (PlayerFragment) getFragmentManager().findFragmentById(R.id.player_fragment);
                if (frag == null) {
                    FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.add(R.id.player_fragment, new PlayerFragment());
                    ft.commit(); 
                }}
        }
    });

}}

list_songs.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF">
<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />   
<fragment
    android:id="@+id/player_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.songs.PlayerFragment" />     
</LinearLayout>

フラグメント クラスは次のとおりです。

public class PlayerFragment extends Fragment implements  OnTouchListener, OnCompletionListener, OnBufferingUpdateListener{

private Button btn_play;
private SeekBar seekBar;
private MediaPlayer mediaPlayer;
private int lengthOfAudio;
private int length=0;
String URL = (new AppConfig()).getURL();
private final String url = URL + "/play/song.mp3";
private final Handler handler = new Handler();
private final Runnable r = new Runnable() { 
    public void run() {
        updateSeekProgress();                   
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@SuppressLint("NewApi")
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.player_fragment, container, false);
    btn_play = (Button) view.findViewById(R.id.btn_play);
    btn_play.setOnClickListener(new OnClickListener());
    seekBar = (SeekBar)getActivity().findViewById(R.id.seekBar);
    seekBar.setOnTouchListener(this);

    mediaPlayer = new MediaPlayer();
    mediaPlayer.setOnBufferingUpdateListener(this);
    mediaPlayer.setOnCompletionListener(this);

    return view;
}}

フラグメント XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<Button
    android:id="@+id/btn_play"
    android:layout_width="70dp"
    android:layout_height="wrap_content"
    android:text="play" />
</LinearLayout>
</LinearLayout>
4

2 に答える 2

1

まず、fill_parent幅と高さの両方を指定したためListView、ListView は親全体 (ここではLinearLayout) を占有するため、Fragment. nullコードをチェックインしたのは良いことですが、画面にない(添付されていない)if (frag == null)フラグメントを同じものに追加しようとしています。View

Fragmentがビュー階層に関連付けられていないことがわかった場合は、おそらく新しいアクティビティを開始する必要があります。

if (frag == null) {
    Intent playerActivity = new Intent(DisplaysongDetails.this, PlayerActivity.class)
    startActivity(playerActivity);
    }

ここで、新しいActivityという名前を作成し、そのレイアウトPlayerActivityに追加します。PlayerFragmentを使用して任意の項目データを渡すことができますExtras

于 2013-02-27T04:51:30.560 に答える
1

別の問題:

seekBar = (SeekBar)getActivity().findViewById(R.id.seekBar);
seekBar.setOnTouchListener(this);

seekBarアクティビティではなく、フラグメント レイアウトの一部としてのみ定義されます。リスナーを追加しようとすると、その呼び出しgetActivity().findViewById()が返さnullれ、NPE が発生する必要があります。ただし、他に何か問題があるかどうかを確認するには、(スタック トレースからの) 詳細情報が必要です (これと文字列の比較以外に)。

有効なもの:

seekBar = (SeekBar)view.findViewById(R.id.seekBar);
seekBar.setOnTouchListener(this);
于 2013-02-27T04:34:39.933 に答える