簡體   English   中英

如何在不承載該片段的活動中刷新從 Listview 接收數據的片段中的 Textview

[英]How to refresh a Textview in a fragment which receives data from a Listview in an activity which doesn't host that fragment

我創建了一個包含 5 個片段的底部導航欄,因此一旦單擊每個選項卡,它將從一個片段切換到另一個片段。

問題是:第二個片段(搜索片段)有 1 個帶有 setOnClickListener 的 TextView,因此一旦它被舔,一個布局活動將在頂部打開,其中包括一個 ListView 以允許用戶選擇/單擊特定項目,以便稍后此選定項目信息應顯示在(搜索片段)內的該 TextView 上。

問題是這個 Textview 不會更新,除非我調用 mainActivity 來更新底部導航欄中的所有片段

我的問題是如何在不調用 MainActivity 的情況下刷新該特定片段。

 public class MainActivity extends AppCompatActivity {



final Fragment f1 = new HomeFragment();
final Fragment f2 = new SearchFragment();
final Fragment f3 = new CameraFragment();
final Fragment f4 = new ChatFragment();
final Fragment f6 = new LogginFragment();

final FragmentManager fm = getSupportFragmentManager();
Fragment active = f1;

@Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    BottomNavigationViewEx bnve = (BottomNavigationViewEx) findViewById(R.id.bottom_navigation);

    bnve.enableAnimation(false);
    bnve.enableShiftingMode(false);
    bnve.enableItemShiftingMode(false);
    bnve.setOnNavigationItemSelectedListener(navListener);

    if(SharePrefManager.getInstance(this).isLoggedin()){
        finish();
        startActivity(new Intent(this, SuccessActivity.class));
        return;
    }
    fm.beginTransaction().add(R.id.fragment_container, f6, "6").hide(f6).commit();
    //fm.beginTransaction().add(R.id.fragment_container, f5, "5").hide(f5).commit();
    fm.beginTransaction().add(R.id.fragment_container, f4, "4").hide(f4).commit();
    fm.beginTransaction().add(R.id.fragment_container, f3, "3").hide(f3).commit();
    fm.beginTransaction().add(R.id.fragment_container, f2, "2").hide(f2).commit();
    fm.beginTransaction().add(R.id.fragment_container, f1, "1").commit();



}



public BottomNavigationViewEx.OnNavigationItemSelectedListener navListener =
        new BottomNavigationViewEx.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                switch (item.getItemId()) {

                    case R.id.nav_home:
                        fm.beginTransaction().hide(active).show(f1).commit();
                        active = f1;
                        return true;

                    case R.id.nav_search:
                        fm.beginTransaction().hide(active).show(f2).commit();
                        active = f2;
                        return true;
                    case R.id.nav_camera:
                        fm.beginTransaction().hide(active).show(f3).commit();
                        active = f3;
                        return true;
                    case R.id.nav_chat:
                        fm.beginTransaction().hide(active).show(f4).commit();
                        active = f4;
                        return true;
                    case R.id.nav_account:
                        fm.beginTransaction().hide(active).show(f6).commit();
                        active = f6;
                        return true;

                }



                return false;

            }
        };

    }

------------------------SearchFragment 類------------------------ ----------

這是搜索片段,其中包含應該在不調用 MainActivity 的情況下更新/引用的 textView(類別)

public class SearchFragment extends Fragment  {


 private Context mContext;
 TextView Categories;


static boolean status = false;
String SelectedItem;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.fragment_search,container,false);
    Categories = (TextView) v.findViewById(R.id.categories);
    SelectedItem = DataHolder.getInstance().getItem();





        Categories.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(mContext, AllCateActivity.class));

            }
        });

        if(status){Categories.setText(SelectedItem);}


    return v;
}

public void ChangeStatus(Boolean status){

    this.status = status;
    }

@Override
  public void onAttach(Context context) {
    super.onAttach(context);
    mContext=context;
     }




 }

--------------------------DataHolder 類-------------- -----------

這作為一種設計模式在搜索片段和 Categories_Activity 之間共享參數

  public class DataHolder {

 private static DataHolder dataHolder = null;

 private DataHolder() {
     }

  public static DataHolder getInstance() {
if (dataHolder == null)
{
    dataHolder = new DataHolder();
}
return dataHolder;
 }


  private  String item;

 public String getItem() {
return item;
 }

public void setItem(String item) {
 this.item = item;
     }

 }

--------------------------Categories_Activity------------------------ ----------

此活動一旦被稱為列表視圖,將顯示允許用戶選擇一個項目。 因此,一旦選擇了一個項目,它將啟動 MainActivity 以刷新搜索片段中的文本字段

 public class Categories_Activity extends AppCompatActivity implements View.OnClickListener {

ImageView BacktoMainCate;
ListView subCate;
public String selectedItem;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab_subcategory);
    subCate = (ListView)findViewById(R.id.listview_subcate);
    BacktoMainCate = (ImageView)findViewById(R.id.BacktoMainCate);
    BacktoMainCate.setOnClickListener(this);

           final SearchFragment SF = new SearchFragment();
    subCate.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             selectedItem = String.valueOf(parent.getItemAtPosition(position));
            DataHolder.getInstance().setItem(selectedItem);
            SF.ChangeStatus(true);

  Intent in = new Intent(Categories_Activity.this,SuccessActivity.class);
                startActivity(in);

    });

}





@Override
public void onClick(View v) {

    if (v == BacktoMainCate){
        //startActivity(new Intent(this,AllCateActivity.class));
        finish();
    }




   }
}

我在 Fragment/Activity 生命周期中都使用了 SharedPreferences。

因此,一旦 Categories_Activity 啟動,Main Activity 將進入 onPause,並且它的所有 Fragment 將被置於 onPause。 當用戶單擊 Categories_Activity 中的 ListView 項目之一時,所選項目的數據將存儲在 SharedPreferences 中,例如:

PreferenceManager.getDefaultSharedPreferences(Categories_Activity .this)
        .edit().putString(key, selectedItemInfo).apply();

然后在 MainActivity 和 SearchFragment 中覆蓋 onResume() 方法:

@Override
public void onResume() {
super.onResume();
String value = PreferenceManager.getDefaultSharedPreferences(getContext())
        .getString(key, "");
if (value != null && !value.isEmpty()) {
    Categories.setText(value);
  PreferenceManager.getDefaultSharedPreferences(getContext()).edit().remove(key);
   }
}

暫無
暫無

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

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