我正在尝试关注Android教程,我似乎一直在遇到同样的问题:大多数教程都没有提及片段,而我最新版本的android SDK会自动创建布局文件夹中的fragment_main.xml。
这一个教程(https://developers.facebook.com/docs/android/getting-started#login)要求我一步一步地遵循,我的应用程序最终无法正常工作,因为我的.java文件存在重大差异。
在这个具体的例子中,我按照上面逐步链接的facebook sdk教程,最后我在尝试将他们的步骤包含在我的不同代码中时遇到了大量错误,例如:
"The method onCreate(Bundle) of type MainActivity must override or implement a supertype method"
和
"The method setContentView(int) is undefined for the type MainActivity".
在最后的教程中,它提供了完整的MainActivity.java文件。那时,我用他们的代码替换了我的代码,错误消失了,但是应用程序实际上在开始时就失败了,说“不幸的是,FacebookLoginApp已经停止了”。
有没有办法保持最新的当前做法,同时仍然能够使用这样的教程?
如果我需要提供更多信息,请告诉我。
在此先感谢,我非常感谢您在本网站上获得的帮助。
如果这有帮助,这是我创建的整个MainActivity.java文件贯穿整个教程,而不是我之后复制的那个。
package com.facebookloginapp;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
import com.facebook.*;
import com.facebook.model.*;
import android.widget.TextView;
import android.content.Intent;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
// start Facebook Login
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
// make request to the /me API
Request.newMeRequest(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
TextView welcome = (TextView) findViewById(R.id.welcome);
welcome.setText("Hello " + user.getName() + "!");
}
}
}).executeAsync();
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}
}
答案 0 :(得分:2)
创建新应用程序时,只需将布局名称复制到片段布局名称(例如activity_main)
您获得没有片段部分的活动。
从活动
中删除此部分代码if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
清理您的项目。
答案 1 :(得分:1)
您不必使用片段。对于许多人来说,许多应用程序片段不是必需的,并且会降低您的应用程我甚至说大多数应用都没有使用它们。仅仅因为它们是新事物并不意味着你应该使用它们。根据您的应用尝试做的事情来决定是否有意义。与此同时,更改现有教程以使用片段是没有意义的,除非这样做会使它们更清晰 - 这将是一个很小比例的教程,因为教程往往只用极少的花哨UI编写。< / p>
答案 2 :(得分:1)
有没有办法保持最新的当前做法,同时仍然能够使用这样的教程?
是。你必须自己调整教程。对于您的示例,请充分了解片段,将FB的旧硬件教程代码转换为现代用语,直至其运行。这可能涉及多个SO帖子。但是你会彻底地学习它。
就像内置练习一样!
是的,这很难。编程很难。片段是怪异的怪人。但是仔细阅读文档,你会发现有足够的相似之处来拼凑一个有效的实现。