我已经玩了几个星期的MVP模式,我已经到了需要上下文来启动service和访问的地步Shared Preferences.
我已经读过MVP的目的是将视图与逻辑分离,并且context在一个内部Presenter可以打败那个目的(如果我错了,请纠正我).
目前,我有一个看起来像这样的LoginActivity:
LoginActivity.java
public class LoginActivity extends Activity implements ILoginView {
private final String LOG_TAG = "LOGIN_ACTIVITY";
@Inject
ILoginPresenter mPresenter;
@Bind(R.id.edit_login_password)
EditText editLoginPassword;
@Bind(R.id.edit_login_username)
EditText editLoginUsername;
@Bind(R.id.progress)
ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
MyApplication.getObjectGraphPresenters().inject(this);
mPresenter.setLoginView(this, getApplicationContext());
}
@Override
public void onStart() {
mPresenter.onStart();
ButterKnife.bind(this);
super.onStart();
}
@Override
public void onResume() {
mPresenter.onResume();
super.onResume();
}
@Override
public void onPause() {
mPresenter.onPause();
super.onPause();
}
@Override
public void onStop() …Run Code Online (Sandbox Code Playgroud) 我有一个适配器,用于绘制导航抽屉的布局.我的导航抽屉包含两个内部xml文件:一个是Header,另一个是Row.我在一个适配器中绘制它们,但是当我尝试setText()使用我的标头时,我无法绑定.这是我的适配器类:
public class DrawerAdapter extends RecyclerView.Adapter<DrawerAdapter.ViewHolder> {
private static final int HEADER_TYPE = 0;
private static final int ROW_TYPE = 1;
private static Context context;
private static DatabaseHelper databaseHelper;
private List<String> rows;
private List<Integer> icons;
private String driverName;
public DrawerAdapter(Context context, List<String> rows, List<Integer> icons, String driverName, DatabaseHelper databaseHelper) {
this.icons = icons;
this.rows = rows;
this.context = context;
this.driverName = driverName;
this.databaseHelper = databaseHelper;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { …Run Code Online (Sandbox Code Playgroud) 我遵循的模型视图演示者(MVP)模式类似于Antonio Leiva在这里找到的例子:antoniolg/github.
我一直在玩它很多,我想知道如何service从interactor图层开始.通常情况下,我一直在retrofit调用我的电话,interactor但我想知道是否有办法从服务器启动服务,interactor所以我可以retrofit在服务中运行我的电话.这里的问题是我没有运行服务的活动上下文,如果我要将上下文暴露给它,它会破坏MVP的目的interactor.
我也不太确定这是否是一件好事(从交互者那里开始服务).我正在考虑从presenter层中启动服务,但是我正在朝着如何接近它的方向走向死胡同.
如果有办法解决这个问题,请帮助一个人吗?如果这不是一个好方法,或者启发我.
我有三个相互依赖的下拉列表.这是代码:
echo CHtml::dropDownList('island_id',$island,$locationsList,
array('ajax'=>array('type'=>'POST',
'url'=>CController::createUrl('supplierHead/getRegions'),
'update'=>'#region_id',),
'id'=>'island_id',
'empty'=>'Choose Island',
));
echo " ";
echo CHtml::dropDownList('region_id',$region, $regionsList,
array('ajax'=>array('type'=>'POST',
'url'=>CController::createUrl('supplierHead/getProvinces'),
'update'=>'#province_id',),
'id'=>'region_id',
'empty'=>'Choose Region',
));
echo " ";
echo CHtml::dropDownList('province_id',$province,$provincesList, array('empty'=>'Choose Province'));
Run Code Online (Sandbox Code Playgroud)
island_id是父级,当选择一个值时,它会更新第二个下拉列表并使用相对于父级的数据填充它,然后一旦选择了第二个下拉列表的值,它就会填充第三个下拉列表的可用值.
问题:
当所有下拉列表都设置为值并且我决定更改第一个下拉列表(父项)的值时,它会更新第二个下拉列表的值,但不会更新第三个下拉列表的值.第3个下拉列表仅在我手动更改第2个下拉列表中的值时更新.此外,当第二个下拉列值更改时,第三个下拉列表更新是正确的,但父级不会更改.我怎样才能解决这个问题?
这是我的控制器:
public function actionGetRegions()
{
$data=Locations::model()->findAll('location_parent=:location_parent AND location_id != :location_parent', array(':location_parent'=>(int) $_POST['island_id']));
$data=CHtml::listData($data, 'location_id', 'location_name');
foreach ($data as $value => $name) {
echo CHtml::tag('option', array('value'=>$value), CHtml::encode($name), true);
}
}
public function actionGetProvinces()
{
$data=Locations::model()->findAll('location_parent=:location_parent AND location_id != :location_parent', array(':location_parent'=>(int) $_POST['region_id']));
$data=CHtml::listData($data, 'location_id', 'location_name');
foreach ($data as $value …Run Code Online (Sandbox Code Playgroud) 我假设使用 Model-View-Presenter (MVP) 模式时编写单元测试会容易得多,但我不确定如何开始。我添加了依赖项以开始编写单元测试Roboelectric并Mockito模拟演示者中使用的所有依赖项。
作为参考,以下是我的演示者登录示例:
public class LoginPresenterImpl implements ILoginPresenter {
@Inject
Bus bus;
@Inject
ISharedPreferencesRepository mSharedPreferencesRepository;
private final String LOG_TAG = "LOGIN_PRESENTER";
private ILoginView loginView;
private LoginInteractorImpl loginInteractor;
private long mLastClickTime = 0;
public LoginPresenterImpl() {
MyApplication.getObjectGraph().inject(this);
this.loginInteractor = new LoginInteractorImpl();
}
@Override
public void setLoginView(ILoginView loginView) {
this.loginView = loginView;
if(mSharedPreferencesRepository.isLoggedIn()) {
Log.i(LOG_TAG, "User logged in already");
this.loginView.navigateToHome();
}
}
@Override
public void validateCredentials(String username, String password) {
if(SystemClock.elapsedRealtime() - mLastClickTime < 1000)
return; …Run Code Online (Sandbox Code Playgroud) 我有一个严重依赖当前时间戳的应用程序。目前,当用户提交请求时,我使用 获取 UTC 中的当前时间戳System.currentTimeMillis()。虽然这工作得很好,但当用户开始Date/Time在设备上操作它们时就会出现问题,并会导致时间戳不准确。
那为什么要在客户端呢?为什么不在服务器上处理呢?嗯,我的应用程序需要离线工作。jobQueue当互联网连接不可用时,我的所有请求都会被推送。在这些情况下,我必须知道用户执行操作的原始时间,因此如果我在 提交请求4:02pm,但由于网络问题,服务器只会在 左右收到它7:30pm,服务器必须知道我在 发送请求4:02pm。
现在我考虑了哪些选择?
BroadcastReceiver任何操作意图Date/Time,然后存储偏移量,以便每当用户提交请求时,我都会使用偏移量计算同步时间,以确保时间戳是准确的。NTP服务器与我的设备同步时间。我不完全确定哪一个是最佳的(假设我已经列出了所有可能的解决方案)。如果还有其他我没有想到的解决方案,请告诉我。
PS 如果我碰巧使用 来BroadcastReceiver监听设备上的任何日期时间操作,我将如何计算其中的偏移量?
这是我第一次遇到这样的问题,我有点傻眼了。我的问题是,每当我调试我的应用程序时,一切都很好,但只要我生成一个 apk 并通过 crashlytics 将它分发给我的 beta 测试人员,所有的地狱都失败了,我被扔了这个Resources$NotFoundExeption。
我检查了我的R.java文件中的资源0x7f070024,发现它显示了:
public static final int common_google_play_services_unknown_issue=0x7f070024;
Run Code Online (Sandbox Code Playgroud)
这对我来说意义不大。然后我继续另一个字符串资源错误,它指向资源 ID 0x7f070036,它显示了我:
public static final int app_name=0x7f070036;
Run Code Online (Sandbox Code Playgroud)
我检查了这个变量的用法,我使用这个字符串资源的唯一地方是在AndroidManifest.xml:
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" //**HERE**
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<meta-data
android:name="io.fabric.ApiKey"
android:value="blablablah"/>
<activity
android:name=".views.activities.LoginActivity"
android:configChanges="keyboard|keyboardHidden"
android:screenOrientation="portrait">
<intent-filter android:label="@string/app_name"> //**HERE**
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
为了完成这个问题,让我添加我的 gradle 文件,因为它们可能对解决这个问题很重要:
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "helpme.jesus"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
dependencies …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用greendao生成器生成我的模型,我不太确定如何添加接受a的属性 List<String>
我知道如何添加List<Model>使用addToMany但如果我需要ArrayList在我的模型中存储一个怎么办?
像这样的东西:
Entity tags = schema.addEntity("Tags");
tags.implementsInterface("android.os.Parcelable");
tags.addLongProperty("tagId").primaryKey().autoincrement();
tags.addLongProperty("date");
tags.addArrayStringProperty("array"); // something like this
Run Code Online (Sandbox Code Playgroud)
我在想创造另一个实体存储阵列的所有值,并且做ToMany这样的
Entity myArray = schema.addEntity("MyArray");
myArray.implementsInterface("android.os.Parcelable");
myArray.addLongProperty("myArrayId").primaryKey().autoincrement();
myArray.addLongProperty("id").notNull().getProperty();
Property tagId = myArray.addLongProperty("tagId").getProperty();
ToMany tagToMyArray = tag.addToMany(myArray, tagId);
tagToMyArray.setName("tags");
myArray.addToOne(tag, tagId);
Run Code Online (Sandbox Code Playgroud) 我有以下html:
<div class="form-group">
<div class="input-group col-sm-12">
<label for="" class="control-label">Comments</label>
<div class="controls">
<textarea id="txtArea" rows="10" cols="50" ng-model="$parent.comments" type="text" ng-trim="false"></textarea>
{{comments}}
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
在我的js控制器内部是以下内容:
$scope.updateComments = function()
{
$http({
method: 'POST',
url: '/create_comment/' + $scope.id+ '?comments=' + $scope.comments,
})
.success(function(data){
$('#myModalComment').modal('hide');
})
}
Run Code Online (Sandbox Code Playgroud)
问题是,每当我处理textarea输入中的换行符时,它都不会处理。
例如,如果我想输入以下行:
first line
second line
Run Code Online (Sandbox Code Playgroud)
我的输出想要这样:
第一行第二行
我该如何解决这个问题?
更新:
万一这可能是PHP掩盖html字符的后端问题,这是我的php控制器内部的函数:
public function createComments($id)
{
$comments = Input::get('comments');
$log= Logger::find($id);
$log->comments= $comments;
$log->save();
}
Run Code Online (Sandbox Code Playgroud) 在我的xml文件中,我有一个recyclerView和一个导航抽屉布局.问题是,如果我将抽屉布局的代码放在RecyclerView的顶部,抽屉布局会显示但RecyclerView变为空白.
如果我反其道而行,则填充RecyclerView,但导航抽屉无处可寻.这是一个xml的东西吗?这是我的布局的xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">
<include
layout="@layout/app_bar"
android:id="@+id/app_bar" />
<android.support.v7.widget.RecyclerView
android:id="@+id/routes_recycler_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/fragment_navigation_drawer"
android:layout_width="@dimen/nav_drawer_width"
android:layout_height="match_parent"
android:layout_gravity="start"
app:layout="@layout/fragment_navigation_drawer"
android:name="com.findthewayapp.fragments.NavigationDrawerFragment"
tools:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud) 我在其他关于这个问题的问题上看到了同样的错误.正如你所看到的,似乎我没有任何错误!除非我的眼睛一直在欺骗我.有帮助吗?
这是我的两个模型:
public class Outer {
@DatabaseField(id = true, canBeNull = false, columnName = "id")
private int id;
@DatabaseField
private long parentOuterId;
@ForeignCollectionField(eager = false)
private ForeignCollection<Item> items;
//getters and setters
}
public class Item {
@DatabaseField(canBeNull = false, columnName = "id")
private int id;
@DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true)
private Outer out;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)