【发布时间】:2015-06-29 09:53:14
【问题描述】:
我已经设法弄清楚如何使用接口 java 类将信息从两个片段(片段 1a 和片段 1b)发送到主活动,但是我在将信息从主活动发送到另一个片段时遇到了真正的困难(片段 2)。我已经尝试了十几件事,但在以下几点上,我在 Main Activity 和 Fragment 2 中不断收到 Null Pointer 异常:
主要活动:
//Send data to Even Split Fragment 2
evenSplit_CalculationFragment2.tellMeWhatEachPersonOwesES(eachPersonOwesESString);
片段 2:
public void tellMeWhatEachPersonOwesES (String eachPersonOwesThisESString) {
amountEachPersonOwesES.setText(eachPersonOwesThisESString);
};
如果有人可以提供帮助,将不胜感激。 Main Activity、Fragment 2 和 Communicator 界面的完整代码如下:
主要活动:
package apps.created.jay.splititapp;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity implements View.OnClickListener, Communicator {
Button nextButton, calculateButton, backButton;
partySizeAndMethodFragment partySize_MethodFragment;
evenSplitCalculationFragment1 evenSplit_CalculationFragment1;
evenSplitCalculationFragment2 evenSplit_CalculationFragment2;
byWhoHadWhatCalculationFragment1 byWhoHadWhat_CalculationFragment1;
byWhoHadWhatCalculationFragment2 byWhoHadWhat_CalculationFragment2;
String numberInPartyString;
String splitMethodString;
String billGrandTotalString;
String eachPersonOwesESString;
double numberInPartyDouble, eachPersonOwesESDouble, billGrandTotalDouble;
TextView codeTesterView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Implement Initial Fragment (i.e. Set Party Size and Method of Split)
FragmentManager splitItFragmentManager = getFragmentManager();
FragmentTransaction splitItFragmentTransaction = splitItFragmentManager.beginTransaction();
partySize_MethodFragment = new partySizeAndMethodFragment();
splitItFragmentTransaction.add(R.id.fragment_container, partySize_MethodFragment);
splitItFragmentTransaction.commit();
//Initialise Next Button
nextButton = (Button) findViewById(R.id.next1button);
nextButton.setOnClickListener(this);
//Initialise Calculate Button
calculateButton = (Button) findViewById(R.id.calculateButton);
calculateButton.setOnClickListener(this);
//Initialise Back Button
backButton = (Button) findViewById(R.id.backButton);
backButton.setOnClickListener(this);
}
//COMMUNICATIONS
//Method of Split (from Party Size & Method Fragment)
@Override
public void respond(String splitMethodData) {
splitMethodString = splitMethodData;
}
// Party Size (from Party Size & Method Fragment)
@Override
public void partyOfWhat(String numberInPartyData) {
numberInPartyString = numberInPartyData;
}
// Total Bill (from Even Split Calculation Fragment 1)
@Override
public void billGrandTotal(String billGrandTotalData) {
billGrandTotalString = billGrandTotalData;
}
//On Button Click
@Override
public void onClick(View v) {
FragmentManager splitItFragmentManager = getFragmentManager();
FragmentTransaction splitItFragmentTransaction = splitItFragmentManager.beginTransaction();
if(v.getId() == R.id.next1button) {
if (splitMethodString.equals("byWhoHadWhat")) {
byWhoHadWhat_CalculationFragment1 = new byWhoHadWhatCalculationFragment1();
splitItFragmentTransaction.replace(R.id.fragment_container, byWhoHadWhat_CalculationFragment1);
splitItFragmentTransaction.addToBackStack(null);
splitItFragmentTransaction.commit();
//Replace Next Button with Calculate & Back Button
nextButton.setVisibility(View.GONE);
calculateButton.setVisibility(View.VISIBLE);
backButton.setVisibility(View.VISIBLE);
} else if (splitMethodString.equals("evenly")) {
//Replace Fragment
evenSplit_CalculationFragment1 = new evenSplitCalculationFragment1();
splitItFragmentTransaction.replace(R.id.fragment_container, evenSplit_CalculationFragment1);
splitItFragmentTransaction.addToBackStack(null);
splitItFragmentTransaction.commit();
//Replace Next Button with Calculate & Back Button
nextButton.setVisibility(View.GONE);
calculateButton.setVisibility(View.VISIBLE);
backButton.setVisibility(View.VISIBLE);
}
}
else if (v.getId() == R.id.backButton){
splitItFragmentTransaction.replace(R.id.fragment_container, partySize_MethodFragment);
splitItFragmentTransaction.addToBackStack(null);
splitItFragmentTransaction.commit();
//Replace Next Button with Calculate & Back Button
nextButton.setVisibility(View.VISIBLE);
calculateButton.setVisibility(View.GONE);
backButton.setVisibility(View.GONE);
}
else if (v.getId() == R.id.calculateButton){
//Convert Strings pulled from Fragments into Doubles
numberInPartyDouble = Double.parseDouble(numberInPartyString);
billGrandTotalDouble = Double.parseDouble(billGrandTotalString.replace(",",""));
eachPersonOwesESString = String.valueOf(billGrandTotalDouble/numberInPartyDouble);
//Replace Even Split Fragment 1 with Even Split Fragment 2
evenSplit_CalculationFragment2 = new evenSplitCalculationFragment2();
splitItFragmentTransaction.replace(R.id.fragment_container, evenSplit_CalculationFragment2);
splitItFragmentTransaction.addToBackStack(null);
splitItFragmentTransaction.commit();
//Send data to Even Split Fragment 2
evenSplit_CalculationFragment2.tellMeWhatEachPersonOwesES(eachPersonOwesESString);
//Hide Calculate Button
calculateButton.setVisibility(View.GONE);
}
}
}
片段 2:
package apps.created.jay.splititapp;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
* Created by Jay on 02/06/2015.
*/
public class evenSplitCalculationFragment2 extends Fragment {
String eachPersonOwesThisESString;
TextView amountEachPersonOwesES;
View evenSplitView2;
Communicator comm;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//Define the View and inflate Fragment 2
evenSplitView2 = inflater.inflate(R.layout.even_split_calculation_fragment_layout_2, container, false);
return evenSplitView2;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
amountEachPersonOwesES = (TextView) evenSplitView2.findViewById(R.id.even_split_amount_due);
comm = (Communicator) getActivity();
}
//COMMUNICATIONS
//What Each Person Owes (from Main Activity)
public void tellMeWhatEachPersonOwesES (String eachPersonOwesThisESString) {
amountEachPersonOwesES.setText(eachPersonOwesThisESString);
}
}
界面:
public interface Communicator {
public void respond (String data);
public void partyOfWhat (String data);
public void billGrandTotal (String data);
}
【问题讨论】:
-
你在与片段的通信之间使用捆绑包
-
捆绑包是发送和接收数据的好方法。
标签: java android android-fragments interface