[英]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.