繁体   English   中英

片段中的Activity中的findViewById

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

解:

您可以将textviewbuttons放在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM