FragmentActivity
を追加するFragment
があります。状況によっては、そのフラグメントのレイアウトからButtons
にアクセスし、それらのクリックリスナーを変更したいです。
私がやることは:
View view = myFragment.getView();
Button myButton = (Button) view.findViewById(R.id.my_button);
myButton.setOnClickListener(new MyClickListener());
ただし、view
変数は常にnull
です。
アクティビティのビューを取得するにはどうすればよいですか?
コンポーネントにアクセスしてデータを設定する場合は、フラグメント内に次のようなメソッドを作成することをお勧めします。
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());
}
}
これを試して:
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());
}
}
}
このコードは正常に動作する必要があります。これがお役に立てば幸いです。
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 にあります。
ソース: この回答
単に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()
メソッド内でボタンを実行することをお勧めします。これにより、ビューがすでに存在することが保証されます。