web-dev-qa-db-ja.com

android.support.v4.app.FragmentManager OR Android.app.FragmentManager?

私はAndroid開発を学んでいます。私は非常に簡単なはずの何かで立ち往生しています。

1つのアクティビティ、2つのフラグメント、1つのインターフェースを備えたアプリを作成しています。

Android:minSdkVersion="11"
Android:targetSdkVersion="19

したがって、メインアクティビティでは、マネージャを使用してフラグメントBへの参照を作成しようとしています。 Eclispseがいくつかの変更を指示しているため、ここで行き詰まります(以下を参照)。

私の意図: `

@Override
    public void respond(int i) {
        // TODO Auto-generated method stub

    FragmentManager manager =getFragmentManager();
    FragmentB f2= (FragmentB) manager.findFragmentById(R.id.fragment2);

}`

これを行うと、エラーメッセージが表示され、いくつかの変更を実行する必要があります。変更後、コードは次のようになります(そして、まだFragmentBに到達できません):

    @Override
public void respond(int i) {
    // TODO Auto-generated method stub

    Android.app.FragmentManager manager =getFragmentManager();
    Android.app.Fragment f2=  manager.findFragmentById(R.id.fragment2);

}

詳細については、アクティビティのインポートヘッダーもここに配置します。

  package com.example.modular_ui;

import Android.support.v7.app.ActionBarActivity;
import Android.support.v7.app.ActionBar;
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentManager;
import Android.app.Activity;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;
import Android.view.ViewGroup;
import Android.os.Build;

public class MainActivity extends Activity implements Communicator{....

ここで何が欠けていますか? support.v4 /support.v7全体は、新人にとって少し混乱します。

編集:に変更した後:

    import Android.app.Fragment;
import Android.app.FragmentManager;

AND FragmentActivityを拡張するまだFragmentBへの参照を作成できません:

@Override
public void respond(int i) {
    // TODO Auto-generated method stub

FragmentManager man = getFragmentManager();
FragmentB b = man.findFragmentById(R.id.fragment2);

}

リクエストに応じて、FragmentBコードを投稿しました。

package com.example.modular_ui;

import Android.os.Bundle;
import Android.support.v4.app.Fragment;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.TextView;

public class FragmentB extends Fragment {

TextView text;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    return inflater.inflate(R.layout.fragment_b, container);
}

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        text = (TextView) getActivity().findViewById(R.id.textView1);
    }

メインXML

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context="com.example.modular_ui.MainActivity"
    tools:ignore="MergeRootFrame" >

    <fragment
        Android:id="@+id/fragment1"
        Android:name="com.example.modular_ui.FragmentA"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

    <fragment
        Android:id="@+id/fragment2"
        Android:name="com.example.modular_ui.FragmentB"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentLeft="true"
        Android:layout_below="@+id/fragment1"
        Android:layout_marginTop="54dp" />

</RelativeLayout>
8
Foo

まず第一に:あなたの活動はFragmentActivityを拡張する必要があります。

サポートライブラリについて。これらは、古いAndroidにいくつかの機能を追加するために導入されました。たとえば、フラグメントはAndroid 3.0(SDK nr:11)で導入されました。実際、Android 3.0では(ドキュメントによると)<サポートライブラリはフラグメントのシステム実装を使用します。

4
RobertM

GetSupportFragmentManager();を使用するだけです。 、サポートライブラリを正常に追加した後。

10
bgauryy

OPは、API 11以降support.v4を必要とせずにで正常に機能するソリューションに非常に近かった。

彼は、importステートメントでsupport.v4も使用しないように、Fragmentを変更する必要がありました。

2つのアプローチの要約。 すべてのアクティビティとフラグメントには、これらの1つのように見えるコードが必要です。それらを混ぜないでください! (すべてのファイルですべての行が必要なわけではありません。必要に応じて行を使用してください。)

support-v4アプローチ

import Android.support.v4.app.FragmentActivity;
import Android.support.v4.app.Fragment;      <-- ".support.v4"
import Android.support.v4.app.FragmentManager;

... MainActivity extends FragmentActivity ...

... = getSupportFragmentManager();

.... YourFragment extends Fragment ... <-- same in both approaches

API 11+アプローチ

import Android.app.Activity;
import Android.app.Fragment;
import Android.app.FragmentManager;

... MainActivity extends Activity ...

... = getFragmentManager();

.... YourFragment extends Fragment ... <-- same in both approaches

したがって、上記の1つのアプローチを使用して記述されたプロジェクトがあり、他の場所からコードに統合している場合は、必ずこれらの行を探し、現在の行に一致するように変更してください。

6
ToolmakerSteve

簡単だ。

古いデバイス(APIレベル11未満)でもアプリを実行する場合は、getSupportFragmentManager()を使用します。

APIレベルが11を超えるデバイスでアプリを実行する場合は、getFragmentManger()を使用します。

2
suresh yadam