簡體   English   中英

當其他片段更改第一個片段模型時刷新片段

[英]Refresh fragment when other fragment changes the first's fragment model

我想在視圖分頁器更改為該片段時刷新它。

package com.mcivisoft.rcbeam;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;

import com.mcivisoft.rcbeam.R;

public class FragBeamRec extends Fragment {    
    public static FragBeamRec newInstance() {
        FragBeamRec fragment = new FragBeamRec();
        return fragment;
    }

    public FragBeamRec() {}

    private EditText tasss = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        final View v = inflater.inflate(R.layout.fragment_frag_beam_rec, container, false);

        tasss = (EditText)v.findViewById(R.id.txttttaasss);
        tasss.setText(String.valueOf(var.asspass));

        ActivityBeamRec.mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                if (position == 2) {
                    Fragment frg = null;
                    frg = getFragmentManager().findFragmentByTag("FragBeamRec");
                    final FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.detach(frg);
                    ft.attach(frg);
                    ft.commit();
                }
            }

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

            @Override
            public void onPageScrollStateChanged(int state) {}
        });

        return v;
    }
}

這行不通,誰能告訴我原因。 我一直在嘗試刷新此片段三天,請幫助。

我希望刷新的原因是我在同一活動(選項卡式活動)中得到了另一個片段,在第一個片段中,有一個按鈕進行一些計算並將結果放入全局變量中,並且該片段顯示了公共變量,並且由於它是在單擊按鈕之前創建的,因此顯示0.0 ,這就是為什么我要刷新它以便顯示全局變量的當前值的原因。

除了刷新片段以外,您應該只刷新視圖。 有關教程,請參見有關片段之間通信的指南( http://developer.android.com/training/basics/fragments/communicating.html )。 這里有相同的概念。

基本上,您將希望像這樣在按鈕的OnClickListener內通知FragBeamRec片段計算已完成

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int result = 4 + 4;
            fragBeamRec.onCalculationComplete(result);
        }
    });

帶接口

public interface OnCalcComplete {     
    void onCalculationComplete(int result);
}

然后在片段中有類似

public class FragBeamRec extends Fragment implements OnCalcComplete {
    public void onCalculationComplete(int result) {
        textView.setText(result);
    }
...
}

我通過替換private EditText tasss = null; 通過public static EditText tasss = null; 這樣,我可以從任何地方訪問它。在單擊偵聽FragBeamRec.tasss.setText(String.valueOf(var.asspass));中的按鈕上FragBeamRec.tasss.setText(String.valueOf(var.asspass));

我認為您的整個實施過程都很不穩定

您在ActivityBeamRec內部的ViewPager中具有FragBeamRec。

這樣一來,如果ViewPager內有4個片段,則可能在所述數據模型發生更改時甚至從未創建FragBeamRec。

最好的實現是從ActivityBeamRec刷新所有內容。 在活動內部注冊viewPagerChangeListener。 您還可以綁定模型更改時在ActivityBeamRec活動上觸發的偵聽器接口。

您現在可以使用以下方式從活動中獲取片段

private Fragment getFragmentFromPager(int index) {
    return getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.parentViewPager + ":" + index);
}

通過在viewPager中傳遞Fragment索引位置,您將獲得一個Fragment對象,您可以使用該對象執行任何形式的刷新

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM