- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:我意识到我正在以错误的心态思考它,我需要“返回”在对话框中输入的值。标题已更新以反射(reflect)这一点。对话框 fragment 是从 onNavigationItemSelected 调用的。如何将这些值从对话框“返回”到主 Activity 以供使用?我无法从 onclicklistener 中的对话框调用 mainactivity 方法,它说“不能从静态上下文引用非静态方法”。
<小时/>我的 MainActivity 中有一个 webview,我的应用程序基于该 webview,其他所有内容都是 fragment 或对话框。我需要能够引用这个 webview,这样我就可以根据用户在对话框中输入的内容来用它做一些事情。
我有一个用于与 webview 交互的 JavaScriptInterface 类,我也遇到了同样的问题,但通过将其扩展到 MainActivity 来对其进行排序(我不知道这是否是最好的方法,可能不是)。
在对话框和其他类中我不能这样做,因为它需要扩展其他东西,即对话框等。那么我如何从这些类中获取对它的引用呢?
主要 Activity :
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
Context context;
public WebView webView;
JSInterface JSInterface;
// other stuff
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = getApplicationContext();
webView = findViewById(R.id.webView);
JSInterface = new JSInterface(this, this);
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
//creating fragment object
Fragment fragment = null;
//initializing the fragment object which is selected
if (id == R.id.nav_home) {
} else if (id == R.id.nav_go_to) {
FragmentManager fm = getSupportFragmentManager();
DialogFragmentGoTo dialogFragment = new MyDialogFragment();
dialogFragment.show(fm, "MyDialogFragment");
}
//replacing the fragment
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_main, fragment);
ft.addToBackStack(null);
ft.commit();
}
DrawerLayout drawer = findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
JS接口(interface):
public class JSInterface extends MainActivity {
private MainActivity mainActivity;
JSInterface(Context context, MainActivity mActivity) {
mainActivity = mActivity;
}
@JavascriptInterface
public void someMethod() {
//can interact with webview from here if needed, as if from mainactivity
}
// other methods
}
对话框 fragment :
public class DialogFragmentGoTo extends DialogFragment {
Context context;
EditText et1;
EditText et2;
LinearLayout layout;
AlertDialog.Builder builder;
String et1Text;
String et2Text;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
//init
context = getContext();
et1 = new EditText(context);
et2 = new EditText(context);
layout = new LinearLayout(context);
builder = new AlertDialog.Builder(getActivity());
//layout options
layout.setOrientation(LinearLayout.VERTICAL);
setDialog();
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
et1Text = et1.getText().toString();
et1Text = et2.getText().toString();
setInputs(et1Text, et2Text);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
});
return builder.create();
}
private void setInputs(String et1Text, String et2Text) {
webView.loadUrl("javascript:setInputs(" + et1Text + "," + et2Text + ");");
}
private void setDialog() {
//et1
et1.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
et1.setImeOptions(EditorInfo.IME_ACTION_UNSPECIFIED);
et1.setSingleLine(true);
et1.setLines(1);
et1.setMaxLines(1);
et1.setHorizontalScrollBarEnabled(false);
et1.setHint("Text1");
layout.addView(et1);
//et2
et2.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
et2.setImeOptions(EditorInfo.IME_ACTION_UNSPECIFIED);
et2.setSingleLine(true);
et2.setLines(1);
et2.setMaxLines(1);
et2.setHorizontalScrollBarEnabled(false);
et2.setHint("Text2");
layout.addView(et2);
//builder
builder.setTitle("Enter texts");
builder.setView(layout);
}
}
现在,如果我将其设为静态,我可以导入它,但这不是一个选项,而且对于 webview 来说这是不好的做法(内存泄漏):
import static com.example.app.MainActivity.webView;
我是编程初学者,因此如果有人可以帮助我并解释我如何做到这一点 - 我将非常感激。
最佳答案
从其他 Activity/fragment 获取东西? startActivityForResult
更一般地说,您应该查看 MVVM 并创建一个包含您需要的所有信息的 ViewModel。然后您可以使用 WebView 对 Activity 中的信息(也许是 LiveData Observer?)使用react。
关于java - 如何将对话框 fragment 值从对话框返回到主 Activity ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56199602/
我是一名优秀的程序员,十分优秀!