48

ご想像のとおり、onCreateView 内にビューを作成するフラグメントがあります。ただし、定期的にビューを変更したい。

私の使用例は、フラグメントが Web サービスからのデータを表示することです。ユーザーがリスト (別のフラグメント) からオプションを選択すると、このフラグメントはプログレス バーに切り替わり、読み込まれるとデータ ビューに戻ります。

ローディング フラグメントと表示フラグメントの 2 つのフラグメントを作成することもできますが、これはカプセル化されたイベントであるため、すべてを 1 つのフラグメント内で行うほうがよいようです。

基本的に私が求めているのは、フラグメント内の setContentView と同等のものです。

4

9 に答える 9

34

使用できますFragment.getView()。これは、 を含むコンテナのビューを返しますFragment。そのビューで、 を呼び出すことができますremoveAllViews。次に、新しいビューを作成し、 から取得したビューに追加しますgetView()

http://developer.android.com/reference/android/app/Fragment.html#getView()

于 2011-05-26T13:54:12.907 に答える
27

何らかの理由でフラグメント ビュー全体を変更する場合 (たとえば、成功時にビューを変更する非同期 URL 要求)、親アクティビティで FragmentTransaction を使用して、その場で新しいフラグメントを作成することができます。

または、フラグメントを保持し、それ自体を更新するこのフラグメントのメソッドを呼び出すことができます。例: 親アクティビティで、フラグメントのリストを作成して保存しますList<RefreshFragment> mFragmentList

これが RefreshFragment クラスです (私の例では、すべてのフラグメントがこれを拡張しています)。

public class RefreshFragment extends Fragment {
    protected Data data; // here your asynchronously loaded data

    public void setData(Data data) {
        this.data = data;
        // The reload fragment code here !
        if (! this.isDetached()) {
            getFragmentManager().beginTransaction()
               .detach(this)
               .attach(this)
               .commit();
        }
    }
}

次に、アクティビティの非同期コールバックで次を呼び出すことができます。

for (RefreshFragment f : mFragmentList) f.setData(data);

したがって、すべてのフラグメントは正しいデータで更新され、現在アタッチされているフラグメントはすぐに更新されます。もちろん、フラグメントで独自の onCreateView を提供する必要があります。

重要なことは、フラグメントがgetFragmentManager().

ViewModel今日では、その目的で使用することをお勧めします。

于 2012-11-16T13:54:02.850 に答える
4

FrameLayouta を使用して、プログレス バーとデータ ビューを切り替えることができます。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ImageView android:id="@+id/cover_image"
        android:scaleType="fitCenter"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
    <ProgressBar android:id="@+id/cover_progress"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_gravity="center"/>
</FrameLayout>

onViewCreate()次に、両方のビューをインスタンス フィールドに格納します。

public View onCreateView(LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState) {
    ...
    image = (ImageView) container.findViewById(R.id.cover_image);
    progress = container.findViewById(R.id.cover_progress);
    ...
}

2つを切り替えたいときはいつでも(UI /メインスレッドでこれを行うことを忘れないでください)、次のようにしてください

progress.setVisibility(View.INVISIBLE);
image.setVisibility(View.VISIBLE);
于 2011-08-23T13:06:56.817 に答える
3

より簡単な解決策は次のとおりです。受け取ったインフレータとコンテナを onCreateView に保存し、後で使用します。例えば:

private LayoutInflater mInflater;
private ViewGroup mRootView;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mInflater = inflater;
    mRootView = container;
    return null;
}

public void someCallBackLater() {
    // mRootView.removeAllViews();   // in case you call this callback again...
    mInflater.inflate(R.layout.my_layout, mRootView);
}
于 2016-05-22T10:44:58.773 に答える
1

Uはトランザクションの削除と追加を使用できます。任意のビューをロードできるフラグメントを使用しました。フラグメントのコンストラクターには整数が必要です。その整数はR.layoutです。古いフラグメントを削除して新しいフラグメントを配置します。!!! このフラグメントを動的にし、xmlレイアウトではない場合にのみ機能します。LinearLayoutR.id.fragment_layoutのようなものを作成するだけです

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.wundlist_fragmente);
    Log.v("WoundListActivity", "WoundListActivity gestartet...");

    Log.v("WoundListActivity", "Liste...");
    //dynamisch hinzufügen...
    wlf=new WoundListFragment();        
    fm.beginTransaction().add(R.id.fragment_layout,wlf).commit();

}

//If Menubutton Clicked change

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId()==R.id.itemaddwound){
        Log.v("List", "neue Wunde Activity");

        fm.beginTransaction().remove(wlf).commit();
        fm.beginTransaction().add(R.id.fragment_layout, new NewWoundFragment()).commit();

    }

    return super.onOptionsItemSelected(item);
}
于 2012-07-30T13:52:42.077 に答える
1

Solostaran14s の応答を使用して、私は今これをやっています:

インターフェース:

public interface FragmentReattachListener {

    public void reAttach();

}

断片:

public class MyFragment extends Fragment implements  FragmentReattachListener {
//...

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    //...
    App.registerFragmentReattachListener(this);
    //...
}

//...    

@Override
public void reAttach() {
    FragmentManager f = getFragmentManager();
    if (f != null) {
         f.beginTransaction()
                    .detach(this)
                    .attach(this)
                    .commit();
        }
    }

}

アプリケーションクラスから:

private static void reattachFragments() {
        if (fragmentReattachListeners.size() > 0) {
            for (FragmentReattachListener listener : fragmentReattachListeners) {
                listener.reAttach();
            }
        }
    }
于 2014-08-23T13:47:37.643 に答える
-1

Fragment.onCreateView は以前に既に呼び出されていましたが、同じ問題があります。fragment.getView() は常に null を返します。

フラグメントがViewPagerに追加されたため、実行時にフラグメントのコンテンツを変更できないため、他の方法を使用してビューを取得しようとしています:

 View view  =  viewPager.getChildAt(0);
 TextView text = (TextView) (view.findViewById(R.id.textView));
 text.setText("12345");

この問題は解決されました。お役に立てば幸いです

于 2016-01-18T03:53:06.677 に答える