FragmentでFabricのTwitter SDKが動いていないような...
関連:
Access Twitter’s REST API — Fabric Android documentation
FragmentManager | Android Developers
など。
もしかして、ActivityからFragmentを取得するとき、FragmentManagerにわたすリソースのidがFragmentの一番外側のレイアウト要素のものになっていませんか。
Fragmentのレイアウトのxml内でfragment要素でなくてLayout要素が一番外側の場合、Fragmentのレイアウトを突っ込んでいる*1Activityの要素のidを渡す必要があるみたいですよ。
つまり、下記のようなレイアウトの場合、R.id.containerInActivity
の方ですね。
事件はJavaじゃなくてxmlで起こってたんだよ、うわぁぁあん!
<!-- activity_main.xml --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/containerInActivity" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> </RelativeLayout>
<!-- fragment_blank.xml --> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/blankFragment" tools:context="com.example.woshidan.twittertest.BlankFragment"> <Button android:id="@+id/twitter_login_button" android:background="#fff" android:textColor="#333" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true"/> </FrameLayout>
// MainActivity.java public class MainActivity extends AppCompatActivity { private static final String TWITTER_KEY = "YOUR_APP_KEY"; private static final String TWITTER_SECRET = "YOUR_APP_SECRET"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET); Fabric.with(this, new Twitter(authConfig)); setContentView(R.layout.activity_main); // TwitterAuthClient twitterAuthClient = new TwitterAuthClient(); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction tr = fm.beginTransaction(); tr.add(R.id.containerInActivity, BlankFragment.newInstance("test", "test2"), "foobar"); tr.commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Make sure that the loginButton hears the result from any // Activity that it triggered. // loginButton.onActivityResult(requestCode, resultCode, data); Log.d("A:onActivityResult", "Clicked"); Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.containerActivity); Log.d("A:onActivityResult", fragment.toString()); if (fragment != null) { fragment.onActivityResult(requestCode, resultCode, data); } } // 以下略
// BlankFragment.java // 前後略 TwitterAuthClient authClient; @Override public void onStart() { super.onStart(); getView().findViewById(R.id.twitter_login_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("twitter_login_button", "Clicked"); login(); } }); } private void login() { authClient = new TwitterAuthClient(); authClient.authorize(getActivity(), new Callback<TwitterSession>() { @Override public void success(Result<TwitterSession> result) { Twitter.getSessionManager().setActiveSession(result.data); TwitterSession session = result.data; } @Override public void failure(TwitterException e) { Log.e("MainActivity", e.getMessage()); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult( requestCode, resultCode,data); if (authClient != null && requestCode == TwitterAuthConfig.DEFAULT_AUTH_REQUEST_CODE) { authClient.onActivityResult(requestCode, resultCode, data); } }
*1:FragmentTransaction#add()で渡しているidですね