2017-07-23 77 views
1

我有一個包含2個片段的活動,一個處理所有數據,另一個處理所有數據,只有一個記分板。試圖將數據從一個片段傳遞到另一個片段,但數據不會出現

當一個玩家出局時,Fragment1會要求一個新玩家的名字,而fragment2會使用該記分牌的名字。 我在fragment1中使用靜態方法getPlayerName()並在fragment2中使用它。

該應用程序由一個ListView +自定義ArrayAdapter組合來填充fragment2。

下面是具有所需細節的簡化代碼,它不顯示錯誤但不起作用。我按下,輸入新名稱,但它不出現在記分板中。

嘗試notifydatasetchanged()在各個地方,但似乎這不是解決方案。

FieldFragment.java

public class FieldFragment extends Fragment { 

static String playerNames[] = new String[11]; 
    int i = 0; 

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

     Button out = (Button)rootView.findViewById(R.id.out); 
     out.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       displayDialog(); 
      } 
     }); 

     return rootView; 


    } 

public void displayDialog(){ 
     final Dialog nameDialog = new Dialog(getActivity()); 
     nameDialog.setContentView(R.layout.dialog); 

     Button ok = (Button)nameDialog.findViewById(R.id.ok_button); 
     ok.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       EditText nameET = (EditText)nameDialog.findViewById(R.id.name_edit_text); 
       playerNames[i] = nameET.getText().toString(); 
       nameDialog.dismiss(); 
      } 
     }); 


     Button cancel = (Button)nameDialog.findViewById(R.id.cancel_button); 
     cancel.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       nameDialog.dismiss(); 
      } 
     }); 
     nameDialog.show(); 
    } 

    public static String getPlayerName(int playerNumber) { 

     return playerNames[playerNumber]; 
    } 
} 

而且ScoreboardFragment:

public class ScoreboardFragment extends Fragment { 

    public ScoreboardFragment() { 
     // Required empty public constructor 
    } 
    PlayerAdapter playerAdapter; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_scoreboard, container, false); 

     int i=0; 

     ArrayList<Players> players = new ArrayList<>(); 
     players.add(new Players(getPlayerName(i++),0,0)); 
     players.add(new Players(getPlayerName(i++),0,0)); 

     playerAdapter = new PlayerAdapter(getActivity(), players); 
     ListView playerList = (ListView)rootView.findViewById(R.id.list_of_players); 
     playerList.setAdapter(playerAdapter); 

     return rootView; 
    } 
} 

有什麼不好的代碼?

我們知道,如果你需要更多的文件

回答

0

片段是弱控制,也避免使用靜態變量傳遞數據。

另一方面,一個Activity必須在其內部的所有片段上都有一個控制器。

可能是您的問題的一件事是,您每次展示它們時都要重新分析這些片段。

更清晰的解決方法是將數據放入Activity中,然後使用Fragments中活動內的私有方法配置數據。

但請確保您在Fragment中的onActivityCreated()方法中獲取數據/活動;否則活動可能爲空(像onCreateView()一些方法活動尚未訪問)

+0

那麼您是指將數據發送到將從Fragment2調用的Activity中的Activity和getter方法? – Abhijeet

+0

@Abhijeet是的確切 – Mohammad

0

對於2活動之間傳遞數據與2個片段:

將數據傳遞給SecondActivity意圖

Intent intent = new Intent(getActivity, SeconActivity.class); 
intent.putExtra("Player", name); 
startActivity(intent); 

接收內部SecondActivity

String name = getIntent().getStringExtra("Player"); 
數據

值發送到ScoreboardFragment當對象創建

ScoreboardFragment fragment = new ScoreboardFragment (name); 

最後你得到的球員的名字。現在你可以使用播放器的名字,無論你想

+0

不,我不是處理2個活動,只有1個活動有2個片段 – Abhijeet

0

通過查看你的代碼可以有以下問題:

  1. 你是不是在FieldFragment遞增i,所以以後每次改變球員的名字被添加到零位置。

  2. 如果您正在顯示一些對話框來獲取玩家的名字,如果ScoreboardFragment已經創建onResume()將被調用。

因此,請檢查是否正在調用onCreateView()以更新名稱。 有關更多詳細信息,請查看onCreateView method gets called when? and How many times in Activity life cycle?

+0

1.好吧,讓我全球化。 2.我不知道這怎麼重要,但無論如何,我嘗試onResume(),沒有幫助 – Abhijeet

+0

您可以使用回調機制在片段之間傳遞數據。欲瞭解更多信息:http://www.journaldev.com/14207/android-passing-data-between-fragments –

相關問題