如何使我的片段利用我的活动数据? [英] How to make my Fragment make use of my Activity Data?

查看:48
本文介绍了如何使我的片段利用我的活动数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个托管3个片段的活动,我的活动包含一些我希望我的第一个片段使用的数据.我尝试调用以下方法,以便活动可以与片段进行通信:

I have an Activity hosting 3 Fragments, my activity contains some data that I want my first fragment to use. I tried invoking the following method so that the activity can communicate with the fragment:

FirstFragment fragmentFirst = (FirstFragment)
                getSupportFragmentManager().findFragmentById(R.id.firstFragment);
        assert fragmentFirst != null;
        fragmentFirst.doSomething("some param");

对于活动类别,并且:

public void doSomething(String param) {
        // do something in fragment
    }

对于片段类,但它产生了:试图在空对象引用上调用虚拟方法'void com.tex.lightweatherforecast.FirstFragment.doSomething(java.lang.String)'运行时错误.

For the fragment class, but it brought out an: Attempt to invoke virtual method 'void com.tex.lightweatherforecast.FirstFragment.doSomething(java.lang.String)' on a null object reference error at runtime.

我的活动代码是:

public class HomeActivity extends AppCompatActivity {
    public static String BaseUrl = "http://api.openweathermap.org/";
    public static String AppId = "9c547bfc852923c3b30d0d62a5ae35e8";
    public static String lat = "9.0574";
    public static String lon = "7.4898";
    // User Timezone name, current time, current temperature, current condition, sunrise, sunset, temperature, pressure, humidity, wind_speed, visibility, UV Index
    TextView time_zone, time_field, current_temp, current_output, rise_time, set_time, temp_out, Press_out, Humid_out, Ws_out, Visi_out, UV_out;
    ConstraintLayout constraintLayout;
    public static int count=0;
    int[] drawable =new int[]{R.drawable.dubai,R.drawable.central_bank_of_nigeria,R.drawable.eiffel_tower,R.drawable.hong_kong,R.drawable.statue_of_liberty};
    Timer _t;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        FirstFragment fragmentFirst = (FirstFragment)
                getSupportFragmentManager().findFragmentById(R.id.firstFragment);
        assert fragmentFirst != null;
        fragmentFirst.doSomething("some param");

        time_zone = findViewById(R.id.textView9);
        time_field = findViewById(R.id.textView4);
        current_temp = findViewById(R.id.textView10);
        current_output = findViewById(R.id.textView11);
        rise_time = findViewById(R.id.textView25);
        set_time = findViewById(R.id.textView26);
        temp_out = findViewById(R.id.textView28);
        Press_out = findViewById(R.id.textView29);
        Humid_out = findViewById(R.id.textView30);
        Ws_out = findViewById(R.id.textView33);
        Visi_out = findViewById(R.id.textView34);
        UV_out = findViewById(R.id.textView35);

        BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView);
        NavController navController = Navigation.findNavController(this, R.id.fragment);
        NavigationUI.setupWithNavController(bottomNavigationView, navController);

        findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getCurrentData();
                constraintLayout = findViewById(R.id.layout);
        constraintLayout.setBackgroundResource(R.drawable.dubai);
        _t = new Timer();
        _t.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() { // run on ui thread
                    @Override
                    public void run() {
                        if (count < drawable.length) {

                            constraintLayout.setBackgroundResource(drawable[count]);
                            count = (count + 1) % drawable.length;
                        }
                    }
                });
            }
        }, 5000, 5000);
    }

            void getCurrentData() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BaseUrl)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    WeatherService service = retrofit.create(WeatherService.class);
    Call<WeatherResponse> call = service.getCurrentWeatherData(lat, lon, AppId);
        call.enqueue(new Callback<WeatherResponse>() {
            @Override
            public void onResponse(@NonNull Call<WeatherResponse> call, @NonNull Response<WeatherResponse> response) {
                if (response.code() == 200) {
                    WeatherResponse weatherResponse = response.body();
                    assert weatherResponse != null;

                    assert response.body() != null;
                    time_zone.setText(response.body().getTimezone());
                    time_field.setText(response.body().getCurrent().getDt());
                    current_temp.setText(response.body().getCurrent().getTemp() + " ℃");
                    current_output.setText(response.body().getCurrent().getWeather().get(0).getDescription());
                    rise_time.setText(response.body().getCurrent().getSunrise() + " AM");
                    set_time.setText(response.body().getCurrent().getSunset() + " PM");
                    temp_out.setText(response.body().getCurrent().getTemp() + " ℃");
                    Press_out.setText(response.body().getCurrent().getPressure() + " hpa");
                    Humid_out.setText(response.body().getCurrent().getHumidity() + " %");
                    Ws_out.setText(response.body().getCurrent().getWindSpeed() + " Km/h");
                    Visi_out.setText(response.body().getCurrent().getVisibility() + " m");

                }
            }

            @Override
            public void onFailure(@NonNull Call<WeatherResponse> call, @NonNull Throwable t) {
            }
        });
            }
        });
    }
}

任何帮助都会得到赞赏

推荐答案

如果要在第一个目标片段中传递活动数据,请避免在活动布局文件中设置图表.

If you want to pass activity data in your first destination fragment, avoid setting up graph in activity layout file.

从活动布局中删除图形实现.并在活动的onCreate方法中按以下方式实现它.

Remove graph implementation from activity layout. And implement it as below in activity's onCreate method.

    NavController navController = Navigation.findNavController(this, R.id.nav_controller);
    Bundle bundle = new Bundle();
    bundle.putString("key", "value");
    navController.setGraph(navController.getGraph(), bundle);

通过参考以下代码更新图形文件.

Update your graph file by referring below code.

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/navigation_graph"
        app:startDestination="@id/homeFragment">

    <fragment android:id="@+id/homeFragment"
          android:name="com.java.HomeFragment"
          android:label="home_fragment"
          tools:layout="@layout/fragment_home">

            <argument 
                android:name="key"
                app:argType="string"/>

    </fragment>

    ...
    ...

</navigation>

在您的家庭片段中,获取参数值.

In your home fragment, get arguments value.

 String data = getArguments().getString("key");

这篇关于如何使我的片段利用我的活动数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆