当前位置: 首页 > 知识库问答 >
问题:

在不使用活动的情况下在两个片段之间传递字符串

上官华池
2023-03-14

我需要在“新日期碎片”和“新事件框架”之间传递字符串 curDate,我看到很多人使用捆绑包,但使用这些我仍然具有空点例外。

我将日历视图转换为一个名为 curDate 的字符串。

public class NewDateFragment extends Fragment {

public String curDate;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

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

    View view = inflater.inflate(R.layout.fragment_newdate,
            container, false);


    CalendarView calendar = (CalendarView) view.findViewById(R.id.calendarView);

    //sets the listener to be notified upon selected date change.
    calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
        @Override
        public void onSelectedDayChange(CalendarView view, int year, int month, int day) {
            curDate = day + "/" + month + "/" + year;

            NewDateFragment fragment = new NewDateFragment();
            Bundle bundle = new Bundle();
            bundle.putString("date", curDate);
            fragment.setArguments(bundle);

            Log.d("Current Date:", curDate);
        }
    });

}

public class NewEventFragment extends Fragment {

     // relative code inside onCreateView
     Bundle b = getActivity().getIntent().getExtras();
        final String dDate = b.getString("date");
}

我的日志:

threadid=1:线程因未捕获的异常而退出(group=0x41640d88)

谢谢你的帮助!

共有2个答案

祁正浩
2023-03-14

如果它们是同一活动中的片段,您可以使用该活动轻松访问它们之间的数据。

步骤 1:在活动中声明字符串 curDate:

public String curDate; //you could also make it private and add a public getter & setter

第2步:在您的NewDateFrament中,在onSelectedDayChange()中,将活动的curDate设置为您刚刚计算的当前日期:

getActivity().curDate = curDate;

第3步:在您的NewEventFrament中,只需从活动中获取值:

public String curDate = getActivity().curDate;
云韬
2023-03-14

给定答案的替代方法是使用事件。如果你真的想避免耦合你的代码 - 意味着摆脱类之间不必要的依赖性,在你的 Activity 中有一个变量不是一个好主意。这是我的建议:

>

  • 将EventBus库添加到您的Gradle文件中:

     compile 'de.greenrobot:eventbus:2.4.0'
    

    创建一个简单的普通旧 java 类来表示您的事件:

    public class CalendarDateSelectedEvent{
       private String currentDate;
    
       public CalendarDateSelectedEvent(String date){
    
          this.currentDate = date;
       }
    
       public String getCurrentDate(){
    
          return currentDate;
       }
    }
    

    在您选择日期的第一个片段中,您可以在选择日期后立即将事件发布到您的第二个片段中,如下所示:

    //somewhere when  a date is selected
    onSelectedDayChanged(String dateSelected){
       EventBus.getDefault().post(new CalendarDateSelectedEvent(dateSelected));
    }
    

    最后,在您的第二个片段中,执行以下操作:

    //could be inside onCreate(Bundle savedInstanceState) method
    @Override
    public void onCreate(Bundle saveInstanceState){
       //......
       EventBus.getDefault().register(this);
    }
    
    @Override
    public void onDestroy(){
       super.onDestroy();
       EventBus.getDefault().unregister(this);
    }
    
    //very important piece here to complete the job
    public void onEvent(CalenderDateSelectedEvent event){
    
        String currentDate = event.getCurrentDate();
        //you can now set this date to view.
    }
    

    在这一点上,你可能会问,为什么所有的哈士奇都有所有这些代码;但答案很简单:活动不必真正知道任何一个片段中发生了什么。您已经消除了代码中不必要的耦合。

    如果您曾经更改活动以执行其他操作,则不必更改片段代码。

    我希望这能帮助你看到这两种片段之间交流的方法的区别!

    第一种方法(您接受的答案涉及三方,而第二种方法仅涉及两方)。这取决于你的选择。

    享受!

  •  类似资料:
    • 我有两个动态片段与一个活动相关联,我试图使用Bundle将一个文本从第一个片段传递到第二个片段,但我得到了空指针异常。在两个片段之间传递字符串是正确的方法吗?下面是我的代码:

    • 我试图将一个活动(LensActivity)中的ArrayList中的值传递给我的主活动上的TextView。在这个网站上,我找到了Intent方法并进行了实验,但似乎无法传递它,信息被提取到字符串lensString中,并传递到Intent,但在主活动中似乎没有传递或获取TextView,在一些实验中,由于getIntent在主活动中,我得到了一个空指针。 这是LensActivity的代码,它

    • 背景: 有两项活动 1x(主活动),1x(子活动-具有列表视图的活动) 主活动扩展了碎片活动,信息将在碎片中使用 单击主活动的菜单项时,子活动将打开 为ListView使用HashMap 我的目标: 单击项的HashMap值应发送回主活动,子活动(带有ListView)应关闭 问题: 我认为我犯了一个巨大的错误,但我无法解决它。 从onOptionsItemSelected和onActivityR

    • 我试图在我的android应用程序中的两个活动之间传递数据,我想使用HashMap(我不想使用Intent)。以下是我的代码: DataHolder.java 在第一个活动中设置值 在其他活动中获得价值 当我用它在activity1到activity2之间传递数据时,它会起作用,但在那之后,当在activity2到activity3之间传递数据时,返回null,因此强制转换为(整数)会导致错误。在

    • 我想知道是否有人可以帮助我用Intent修复此错误? 我有两个活动要连接:网格视图“MainActivity.kt”的第一个活动,列表视图“Main2Activity.kt”的第二个活动,我有来自“Main2Activity.kt”的2个对象实例(adapter1,adapter2 ),当单击“MainActivity.kt”中的特定图像时,我想传递特定的对象实例(adapter1)或(adapt

    • 我是第一次使用代码优先的方法。如果我错过了一些非常基本的东西,请原谅我。 我需要传递连接字符串到DB上下文,但我不能将连接字符串app.config,因为我在类本身调用一个金块,它给我连接字符串。 这种做法正确吗?我无法在本地系统上测试此功能。还是我应该把绳子传给基地 类A():基(连接)