簡體   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