2013-06-10 20 views
13

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

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

しかしview変数は常にnullです:私は何

です。

アクティビティの表示方法を教えてください。

+1

myFragmentは追加され、表示されますか? –

+1

アクティビティのビュー階層で 'findViewById()'を呼び出すのではなく、 'view'を呼び出すことに注意してください。 – laalto

+0

'Button myButton =(Button)findViewById(R.id.my_button);'を実行すると、 'fragment view'ではない現在のビューのボタンを見つけようとします。したがって、期待どおりに動作していません。 –

答えて

21

あなたのコンポーネントにアクセスし、いくつかのデータを設定したい場合は、私はあなたがこのようなフラグメント内のメソッドを作成することをお勧め:

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()); 
    } 
} 
+0

のonCreate()では、多くの場合、getView()がnullを返すことがあります。 ActivityのOnCreateメソッドからsetSettingsを呼び出すと、例外がスローされます –

12

この試してみてください。このコード

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()); 
     } 
    } 
} 

をしなければならない作品良い。 私はこれがあなたを助けてくれることを願っています。

2

フラグメントで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); 
} 

私は、自動的に断片化したwebviewを読み込むためのタイムアタックを設定しようとしていましたが、この方法が私にとっては唯一のものでした。私のプロジェクトはgithubです。

出典:あなたはそれがonViewCreated()メソッドの内部でそれを行う方が良いでしょうFragmentを拡張するクラスの内部であなたのボタンを初期化this answer

1

。これにより、ビューがすでに存在することが保証されます。

1

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

//below block of code write in activity. 

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

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

関連する問題