androidstudio(Ver3.6.1 Java) を使って,プログラムを作っています。androidは初心者です。iOS(swift)は、多少経験があります。
ナビゲーションエディターを使って、下図のような3枚の画面遷移プログラムを作りました。
やりたいことは、二つあります。
1)3枚目Third画面(ThirdFragment)上の「SECOND_FUNCTION」ボタンアクションで、SecondFragment(Second画面)内のメソッドを動 かしたいのです。しかし、findFragmentByID(R.id.seconddFragment)で、Second画面のfragmentを取得しようとすると下図のようにnullが返ってきます。当然クラッシュします。どのようにすればsecond画面のfragmentを取得し、メッソドにアクセスできるのかご教授願います。
](a0b67e3bc3f7fe842e2c7d365719863b.jpeg)
iOS(xcode:swift)では、
let vc:SecondViewController = navigationController?.viewControllers[(navigationController?.viewController.count)! -2]
as! SecondViewController
のような感じで、前の画面のインスタンスが取得できました。
androidstudioの画面とコードを下に示します。
package com.example.test_navigation;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.navigation.Navigation;
Import androidx.navigation.ui.NavigationUI;
Import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NavigationUI.setupWithNavController((Toolbar)findViewById(R.id.toolbar),
Navigation.findNavController(this, R.id.fragment));
}
}
FirstFragment
package com.example.test_navigation;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FirstFragment extends Fragment {
public FirstFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_first, container, false); view.findViewById(R.id.btnFirstTopNext).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Navigation.findNavController(v).navigate(R.id.secondFragment); } } ); return view; }
}
SecondFragment
package com.example.test_navigation;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class SecondFragment extends Fragment {
public SecondFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_second, container, false);
view.findViewById(R.id.btnSecondToNext).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
Navigation.findNavController(v).navigate(R.id.thirdFragment);
}
}
);
return view;
}
public void secondFun(){ Log.d("in A2", "called FromA3"); // **__ここにアクセスしたい!!__** }
}
ThirdFragment
package com.example.test_navigation;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.RequiresApi;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.navigation.Navigation;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.Objects;
public class ThirdFragment extends Fragment {
public ThirdFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_third, container, false);
view.findViewById(R.id.btnThirdToTop).setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
Navigation.findNavController(v).navigate(R.id.action_global_go_Top); // Global Action
}
}
);
view.findViewById(R.id.btnSecondFunOn).setOnClickListener(
new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onClick(View v) {
FragmentManager Fragmentmana = Objects.requireNonNull(getFragmentManager());
SecondFragment fragment = (SecondFragment) Fragmentmana.findFragmentById(R.id.secondFragment);
fragment.secondFun(); // ここからアクセスしたい!!
}
}
);
return view;
}
}
Navigation
nav.xml
<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/nav"
app:startDestination="@id/firstFragment">
<!-- Global Action -->
<action
android:id="@+id/action_global_go_Top"
app:destination="@id/firstFragment"
app:popUpTo="@id/nav"
app:popUpToInclusive="true"/>
<!-- Global Action ここまで -->
<fragment
android:id="@+id/firstFragment"
android:name="com.example.test_navigation.FirstFragment"
android:label="Firstページ"
tools:layout="@layout/fragment_first">
<action
android:id="@+id/action_firstFragment_to_secondFragment"
app:destination="@id/secondFragment" />
</fragment>
<fragment
android:id="@+id/secondFragment"
android:name="com.example.test_navigation.SecondFragment"
android:label="Secondページ"
tools:layout="@layout/fragment_second">
<action
android:id="@+id/action_secondFragment_to_thirdFragment2"
app:destination="@id/thirdFragment" />
</fragment>
<fragment
android:id="@+id/thirdFragment"
android:name="com.example.test_navigation.ThirdFragment"
android:label="Thirdページ"
tools:layout="@layout/fragment_third" />
</navigation>
2)二つ目です。SecondFragmentにBLEの通信プログラムを置きたいと考えております。ThirdFragmentからSecondFragment内に置いた通信メッソド(これが上のsecondFun()メソッド)を動かし、通信済みバイト数をThird画面に随時表示させたいと考えております。
iOSでは、notificationCenter.postで通知し、thirdFragmentで拾っておりました。androidでも同様の機能はありますか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/17 14:10
2020/04/17 18:47 編集
2020/04/20 01:16
2020/04/20 23:55
2020/04/21 12:18 編集
2020/04/21 08:18