[英]findViewById in Activity from Fragment
編輯 :該死的,我只是注意到每次從片段返回主活動時,歷史記錄都會重置,因此我看不到下面的動作是否真正起作用。 我需要檢查我的代碼。
“ coin2” onClick必須在“歷史記錄” TextView中附加一些文本。 片段中的“ coin2”按鈕,而MainActivity中的“ history”按鈕。 我無法使用findViewById訪問該TextView,我閱讀了許多解決方案,但沒有任何效果,因為在“ case R.id.coin2”中,歷史記錄和rootView都無法解析。 CardBackFragment類實際上位於MainActivity.java文件中,而不是單獨的文件中。
fragment.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/coin2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="@string/coin_button"
android:onClick="flipcoin2" />
</LinearLayout>
片段類:
public class CardBackFragment extends Fragment {
public CardBackFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_coindice, container, false);
v.findViewById(R.id.coin2).setOnClickListener(this);
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
TextView history = (TextView) rootView.findViewById(R.id.history);
return v;
}
@Override
public void onClick(View view){
switch (view.getId())
{
case R.id.coin2:
//history and rootView cannot be resolved.
history = (TextView) rootView.findViewById(R.id.history);
final String[] coin = {getString(R.string.head), getString(R.string.tail)};
Random r = new Random();
final int flip = r.nextInt(2);
history.append("\n- " + getString(R.string.coin_message) + coin[flip]);
break;
}
}
您不能從另一個布局訪問另一個視圖,這會導致異常NPE。
解:
您可以將textview
, buttons
放在fragment_main
xml中,以便可以找到findViewById
的ViewViewById,也可以通過編程方式將textView手動添加到父視圖。
注意不要在片段中增加兩個布局,而只增加1個布局。
如果textView
在Activity內。
您可以直接從片段調用getActivity().findViewById
:
樣品:
switch (view.getId())
{
case R.id.coin2:
//history and rootView cannot be resolved.
history = (TextView) CardBackFragment.this.getActivity().findViewById(R.id.history);
final String[] coin = {getString(R.string.head), getString(R.string.tail)};
Random r = new Random();
final int flip = r.nextInt(2);
history.append("\n- " + getString(R.string.coin_message) + coin[flip]);
break;
}
你嘗試過
public class CardBackFragment extends Fragment {
public interface OnCoinClickedListener {
void onCoinClicked(String stringToAppend);
}
public CardBackFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_coindice, container, false);
}
@Override
public void onAttach(Activity activity) {
mListener = (OnCoinClickedListener)activity;
}
@Override
public void onDetach() {
mListener = null;
}
@Override
public void onViewCreated(View v, Bundle b) {
v.findViewById(R.id.coin2).setOnClickListener(this);
}
@Override
public void onClick(View view){
switch (view.getId())
{
case R.id.coin2:
final String[] coin = {getString(R.string.head), getString(R.string.tail)};
Random r = new Random();
final int flip = r.nextInt(2);
mListener.onCoinClicked("\n- " + getString(R.string.coin_message) + coin[flip]);
break;
}
}
然后,在您的活動中:
public class CoinActivity extends Activity implements OnCoinClickedListener{
private TextVIew mHistory;
[...] onCreate {
mHistory = (TextView)findviewById(R.id.history);
}
public void onCoinClicked(String s) {
mHistory.append(s);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.