0

ボタンクリックでアクティビティから現在ロードされているフラグメントにデータを渡したかったのです。 私はInterfaceを作成し、アクティビティに定義してインターフェイスに実装しましたが、フラグメントでレスポンスを取得できませんでした。アクティビティがアクティビティから現在ロードされているフラグメントに変換されていません

アクティビティでボタンが発火するたびに出力が必要です。

ここに私のコードです。これを解決するために私を助けてください。

intefaceを

public interface Click { 
    void onClick(String msg); 
} 

メインActvity

public class MainActivity extends FragmentActivity { 
    DrawerLayout dlMain; 
    Button btnClick; 

    Click click; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     FragmentOne fragmentOne = new FragmentOne(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.flContainer, fragmentOne,"FragmentOne"); 
     ft.commit(); 

     click = (Click) getSupportFragmentManager().findFragmentByTag("FragmentOne").; 

     dlMain = (DrawerLayout) findViewById(R.id.dlMain); 
     btnClick = (Button) findViewById(R.id.btnClick); 

     btnClick.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.e("Btn Click", "click"); 
       click.onClick("Button Clicked!"); 
      } 
     }); 
    } 
} 

FragmentOne

public class FragmentOne extends Fragment implements Click { 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_one, container, false); 
     return view; 
    } 

    @Override 
    public void onClick(String msg) { 
     Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show(); 
    } 
} 

しかし、そこに私は、これが私のエラーログですMainActivity でエラーを取得しています。

05-09 10:30:49.092 19101から19101/com.psk.interfacetest E/BTNクリック:30:05-09 10をクリック49.095 19101から19101/com.psk.interfacetest E/AndroidRuntime:致命的な例外:メイン プロセス:com.psk.interfacetest、PID:com.psk.interfacetest.MainActivity $ 1.onClick(MainActivity.java:37)で19101 java.lang.NullPointerExceptionが android.view.Viewで.performClick(View.java:4471) android.view.View $ PerformClick.run(View.java:18778) (android.os.Handler.handleCallback(H andler.java:808) (android.os.Handler.dispatchMessage(Handler.java:103) (android.os.Looper.loop(Looper.java:193) )でアンドロイド.app.ActivityThread.main(ActivityThread。 java:5345) at java.lang.reflect.Method.invokeNative(ネイティブメソッド) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller dalvik.system.NativeStart.mainでcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) で.RUN(ZygoteInit.java:824) (ネイティブメソッド)

答えて

1

あなたのケースでは、フラグメントの置換が完了できません。ですから、フラグメントからインターフェイスを登録する必要があります。このコードを調べることができます。

 public class AActivity extends FragmentActivity { 
      Click click; 
      @Override 
      protected void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 
FragmentOne fragmentOne = new FragmentOne(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.flContainer, fragmentOne,"FragmentOne"); 
     ft.commit(); 
       DrawerLayout dlMain = (DrawerLayout)findViewById(R.id.dlMain); 
      Button btnClick = (Button) findViewById(R.id.btnClick); 

       btnClick.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Log.e("Btn Click", "click"); 
         click.onClick("Button Clicked!"); 
        } 
       }); 
      } 

      public void setCallback(Click callback) { 
       this.click=callback; 
      } 
      public interface Click { 
       void onClick(String msg); 
      } 
     } 

     public class AFragment extends Fragment implements AActivity.Click { 
      @Override 
      public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
       super.onViewCreated(view, savedInstanceState); 
       if (getActivity() != null) { 
        ((AActivity)getActivity()).setCallback(this); 
       } 
      } 

      @Override 
      public void onClick(String msg) { 

      } 
     } 
+0

おかげで...素晴らしい仕事..... – Rushvi

1
try this 



public class MainActivity extends FragmentActivity { 
    DrawerLayout dlMain; 
    Button btnClick; 

    Click click; 
    private FragmentOne fragmentOne; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     fragmentOne = new FragmentOne(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.imageTitleTextView, fragmentOne, "FragmentOne"); 
     ft.commit(); 

     //click = (Click) getSupportFragmentManager().findFragmentByTag("FragmentOne"); 

    dlMain = (DrawerLayout) findViewById(R.id.dlMain); 
     btnClick = (Button) findViewById(R.id.btnClick); 

     btnClick.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.e("Btn Click", "click"); 
       fragmentOne.listener.onClick("Button Clicked!"); 
      } 
     }); 
    } 
} 


public class FragmentOne extends Fragment { 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_one, container, false); 
     return view; 
    } 
Click listener = new Click() { 
    @Override 
    public void onClick(String msg) { 
     Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show(); 
    } 
}; 

} 
関連する問題