web-dev-qa-db-ja.com

FragmentActivityからフラグメントのビューを取得します

FragmentActivityを追加するFragmentがあります。状況によっては、そのフラグメントのレイアウトからButtonsにアクセスし、それらのクリックリスナーを変更したいです。

私がやることは:

View view = myFragment.getView();
Button myButton = (Button) view.findViewById(R.id.my_button);
myButton.setOnClickListener(new MyClickListener());

ただし、view変数は常にnullです。

アクティビティのビューを取得するにはどうすればよいですか?

26
Drastamat

コンポーネントにアクセスしてデータを設定する場合は、フラグメント内に次のようなメソッドを作成することをお勧めします。

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.Button;

public class DetailFragment extends Fragment {

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


    public void setSettings(){
        Button button = (Button) getView().findViewById(R.id.my_button);
        button.setOnClickListener(new MyClickListener());
    }
}
29
Jarvis

これを試して:

public class YourFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          return inflater.inflate(R.layout.your_fragment, null);
    }

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

        View view = getView();
        if(view != null) {
            view.findViewById(R.id.my_button).setOnClickListener(new MyClickListener());
        }
    }
}

このコードは正常に動作する必要があります。これがお役に立てば幸いです。

15

OnClickListenersをフラグメントに設定するには、フラグメントクラスでonViewCreatedをオーバーライドします。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    view.findViewById(R.id.yourId).setOnClickListener(this);
    //or
    getActivity().findViewById(R.id.yourId).setOnClickListener(this);
}

私はタイマータスクを設定してフラグメント内のWebビューを自動的にリロードしようとしていましたが、この方法が私のために働いた唯一のものでした。私のプロジェクトは github にあります。

ソース: この回答

3
JB0x2D1

単にgetRootView()メソッドを使用して、Activityでフラグメントのデータを取得します。

//below block of code write in activity.

EditText et = (EditText) v.getRootView().findViewById(R.id.name);
Log.d("Name", et.getText().toString());

nameはフラグメントのフィールドです。

Fragmentを拡張するクラス内でボタンを初期化するときは、onViewCreated()メソッド内でボタンを実行することをお勧めします。これにより、ビューがすでに存在することが保証されます。

1
Alex P