学习创建一个类,稍加修改即可重用代码- sdk



过去一周我一直在学习android开发(在Eclipse中)。我正在尽可能多地学习在线课程和阅读书籍,同时也在深入研究并尝试编写应用程序。我在一个应用程序中使用GreenDroid,我有一个现实生活中的例子给你们看。

我有我的主要应用程序类如下:

public class InfoActivity extends GDListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle(R.string.info_activity_title);
    ItemAdapter adapter = new ItemAdapter(this);
    adapter.add(createTextItem(R.string.info_about, AboutActivity.class));
    adapter.add(createTextItem(R.string.info_terms, TermsActivity.class));
    adapter.add(createTextItem(R.string.info_privacy, PrivacyActivity.class));
    setListAdapter(adapter);
}
private TextItem createTextItem(int stringId, Class<?> klass) {
    final TextItem textItem = new TextItem(getString(stringId));
    textItem.setTag(klass);
    return textItem;
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    final TextItem textItem = (TextItem) l.getAdapter().getItem(position);
    Intent intent = new Intent(InfoActivity.this, (Class<?>) textItem.getTag());
    startActivity(intent);
}
}

一切正常。这是我的问题-我怎么能重用代码从一个类在其他,但采取一个变量,并根据它进行更改?-

adapter.add(createTextItem(R.string.info_about, AboutActivity.class));

需要创建另一个活动类。其代码如下:

public class AboutActivity extends GDActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle(R.string.info_about);
    setActionBarContentView(R.layout.info_template);
    WebView engine = (WebView) findViewById(R.id.web_view);  
    engine.setBackgroundColor(0);
    engine.setBackgroundResource(R.drawable.bg);
    engine.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    engine.getSettings().setBuiltInZoomControls(true);
    engine.loadUrl("http://m.example.com/about.html");
    engine.setWebViewClient(new WebViewWithin());
}
}

其他两个类TermsActivity和PrivacyActivity是相同的,除了两个部分:

setTitle(R.string.info_about);

engine.loadUrl("http://m.example.com/about.html");

在后一个活动示例中是:

setTitle(R.string.info_privacy);

engine.loadUrl("http://m.example.com/privacy.html");

由于这是我第一次学习Java,我仍然对许多概念感到困惑。我精通PHP,可以编写一个函数,可以接受字符串变量并将其放入函数中(有效地重用相同的代码),例如:

这是PHP和Java伪代码,让我明白我的观点。

<?php 
function aboutSecondaryPage( $page ) {
  setTitle( this.getString( R.string.info_ . $page ) );
  engine.loadUrl("http://m.example.com/" . $page . ".html" );
}
 ?>

那么给定这些例子,是否有更好的方法让这三个类都重用相同的代码并从另一个类调用它?任何指导都是有用的。事实上,一切都很顺利,我只是想向那些经验更丰富的人学习。

谢谢!

当前解决方案(经过KURTIS EXCELLENT ASSISTANCE)

其他三个活动继承的父活动方法:

public class InfoSecActivity extends GDListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle(getTitleResourceId());
    setActionBarContentView(R.layout.info_template);
    WebView engine = (WebView) findViewById(R.id.web_view);  
    engine.setBackgroundColor(0);
    engine.setBackgroundResource(R.drawable.bg);
    engine.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    engine.getSettings().setBuiltInZoomControls(true);
    engine.loadUrl(getUrlToLoad());
    engine.setWebViewClient(new WebViewWithin());
}
public int getTitleResourceId() {
    return 0;
}
public String getUrlToLoad() {
    return null;
}

}

一个从InfoActivity类调用的子类的例子。

public class AboutActivity extends InfoSecActivity {
public int getTitleResourceId() {
    return R.string.info_about;
}
public String getUrlToLoad() {
    return "http://m.example.com/about.html";
}
}

它工作得很好,但是为了学习最佳实践——我这样做是最好的方式吗?有什么需要注意的吗(这种方法的潜在问题)?这主要是给Kurtis的-希望你再读一遍:-)

您总是可以获取重用的代码并将其提取到抽象父类中。在父类中,你会放入所有活动共享的代码。但是在代码不同的地方,您调用在每个子类中具体实现的抽象方法。这被称为模板设计模式。例如,在抽象父类的onCreate方法中你可以这样做:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setTitle(getTitleResourceId());
    setActionBarContentView(R.layout.info_template);
    WebView engine = (WebView) findViewById(R.id.web_view);  
    engine.setBackgroundColor(0);
    engine.setBackgroundResource(R.drawable.bg);
    engine.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    engine.getSettings().setBuiltInZoomControls(true);
    engine.loadUrl(getUrlToLoad());
    engine.setWebViewClient(new WebViewWithin());
}

在这种情况下,您将在父类中声明getTitleResourceId()getUrlToLoad()为抽象。然后在每个子类中,您必须编写的唯一代码片段是getTitleResourceId()getUrlToLoad()方法的定义。例如,在您的隐私活动中,您将有这些方法分别返回R.string.info_privacy"http://m.example.com/privacy.html"。但是在你的其他子类中,你会让它们返回不同的值。

最新更新